используя группу по операторам в sql

у меня есть два столбца - идентификатор электронной почты и идентификатор клиента, где идентификатор электронной почты может быть связан с несколькими идентификаторами клиентов. Теперь мне нужно перечислить только те идентификаторы электронной почты (вместе с соответствующими идентификаторами клиентов), которые имеют более одного идентификатора клиента. Я пытался использовать группирующие наборы, операторы свертки и куба, однако не получил желаемого результата.

Любая помощь или указатели будут оценены.


person PratikGandhi    schedule 22.07.2015    source источник
comment
Для какой конкретной СУБД это? Пожалуйста, добавьте соответствующий тег, например oracle, mysql, postgresql, db2, sql-server, interbase или любой другой, который вы можете использовать.   -  person marc_s    schedule 22.07.2015
comment
возможный дубликат SQL: использование группы и предложения   -  person Tab Alleman    schedule 22.07.2015


Ответы (5)


Я думаю, это даст вам то, что вы хотите, если я правильно понимаю ваш вопрос

select emailid, customerid from tablename where emailid in 
(
select emailid from tablename group by emailid having count(emailid) > 1
)
person Kevin    schedule 22.07.2015
comment
это сделало это для меня ... не понимал, что это будет так просто ... излишне усложняло ситуацию, используя группу по операторам - person PratikGandhi; 22.07.2015

Похоже, вам нужно будет использовать HAVING

e.g

SELECT email_id, COUNT(customer_id)
From sometable
GROUP BY email_id
HAVING COUNT(customer_id) > 1

HAVING позволяет вам фильтровать по группировке определенного столбца.

person Mat Richardson    schedule 22.07.2015

Если вам нужен разделенный запятыми список всех их идентификаторов клиентов, возвращенных с одним идентификатором электронной почты, вы можете использовать GROUP_CONCAT для этого.

Это найдет все email_id по крайней мере с 1 customer_id и даст вам список всех customer_id, разделенных запятыми, для этого email_id:

SELECT email_id, GROUP_CONCAT(customer_id)
FROM your_table
GROUP BY email_id
HAVING count(customer_id) > 1;

Предполагая, что email_id #1 был назначен для customer_ids 1, 2 и 3, ваш вывод будет выглядеть так:

email_id | customer_id
1        | 1,2,3

Я не знал, что вы используете MS SQL, здесь есть тема о моделировании GROUP_CONCAT в MS SQL: Моделирование функции group_concat MySQL в Microsoft SQL Server 2005?

person Ben Fried    schedule 22.07.2015
comment
в этом случае я не получу идентификатор клиента ... он только перечисляет электронные письма и их количество - person PratikGandhi; 22.07.2015
comment
См. GROUP_CONCAT, который я разместил. - person Ben Fried; 22.07.2015
comment
есть ли что-нибудь подобное для сервера ms sql? - person PratikGandhi; 22.07.2015
comment
О, я не знал, что вы используете MS SQL, дайте мне посмотреть - person Ben Fried; 22.07.2015
comment
да, я тоже это видел... это будет намного сложнее, чем я надеялся... в любом случае, решение Кевина сработало для меня... спасибо за вашу помощь - person PratikGandhi; 22.07.2015

SELECT t1.email, t1.customer
FROM table t1 
INNER JOIN (
    SELECT email, COUNT(customer)
    FROM table
    GROUP BY email
    HAVING COUNT(customer)>1
    ) t2 on t1.email = t2.email

Это должно дать вам то, что вы ищете. По сути, как заявили другие люди, вы можете фильтровать группу по результатам с помощью HAVING. Но поскольку впоследствии вам нужны идентификаторы клиентов, присоедините весь выбор к исходной таблице, чтобы получить результаты. Вероятно, можно было бы сделать красивее, но это легко понять.

person MADnoobie    schedule 22.07.2015

SELECT 
    email_id,
    STUFF((SELECT ',' + CONVERT(VARCHAR,customer_id) FROM cust_email_table T1 WHERE T1.email_id = T2.email_id
          FOR
           XML PATH('')
          ),1,1,'') AS customer_ids
FROM
    cust_email_table T2
GROUP BY email_id
HAVING COUNT(*) > 1

это даст вам одну строку для каждого идентификатора электронной почты и списка идентификаторов клиентов, разделенных запятыми.

person JamieD77    schedule 22.07.2015