在 sql 中使用 group by operators

using group by operators in sql

我有两列 - 电子邮件 ID 和客户 ID,其中一个电子邮件 ID 可以与多个客户 ID 相关联。现在,我只需要列出那些数量超过 1 个客户 ID 的电子邮件 ID(及其相应的客户 ID)。我尝试使用分组集、汇总和多维数据集运算符,但是,我没有得到想要的结果。

如有任何帮助或指点,我们将不胜感激。

如果您需要以逗号分隔的所有客户 ID 列表以及单个电子邮件 ID,您可以使用 GROUP_CONCAT

这将找到所有 email_id 至少有 1 个 customer_id,并为您提供一个逗号分隔的列表,其中包含该 email_id 的所有 customer_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,这里有一个关于在 MS SQL 中模拟 GROUP_CONCAT 的帖子:Simulating group_concat MySQL function in Microsoft SQL Server 2005?

听起来您需要使用 HAVING

例如

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

HAVING 允许您按照特定列的分组进行过滤。

SELECT emailid
FROM 
(  SELECT emailid, count(custid)
   FROM table
   Group by emailid
   Having count(custid) > 1
)
WITH email_ids AS (
    SELECT email_id, COUNT(customer_id) customer_count
    FROM Table
    GROUP BY email_id
    HAVING count(customer_id) > 1
)

SELECT t.email_id, t.customer_id
FROM Table t
INNER JOIN email_ids ei
    ON ei.email_id = t.email_id

认为如果我理解正确的话,这会得到你想要的

select emailid, customerid from tablename where emailid in 
(
select emailid from tablename group by emailid having count(emailid) > 1
)
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 按结果过滤组。但是,由于您之后需要客户 ID,请将整个 select 连接回您的原始 table 以获得结果。可能可以做得更漂亮,但这很容易理解。

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

这将为您提供每个电子邮件 ID 和逗号分隔的客户 ID 列表的一行。