在 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 列表的一行。
我有两列 - 电子邮件 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 列表的一行。