呃,我知道这是一个糟糕的头衔,但我想不出用一种简单的陈述来总结我的问题的方法。这是一个相当基本的T-SQL查询问题,但我在过去一年左右没有多少使用过T-SQL而且我的大脑根本就不想今天工作。
基本上我有一个包含用户名(电子邮件地址)和客户端ID的表。每个客户端不能有多封电子邮件,但不同客户端可能会有多封电子邮件。我试图在电子邮件地址上进行分组,以计算与1个或多个客户关联的电子邮件数量 - 这很容易。我努力的地方还在尝试列出与该电子邮件地址相关联的客户ID。
例如,我有这个查询,它给了我正在寻找的一半:
select UserName, COUNT(*)
from UserTable
group by UserName
having COUNT(*) > 1
order by COUNT(*) desc
但我还希望每个客户端都有一行,或者甚至只有多个新列显示与该电子邮件地址关联的每个客户端ID,例如:
user1@test.com 3
user1@test.com 34
user1@test.com 9
OR
user1@test.com 3 34 9
感谢任何帮助。
答案 0 :(得分:2)
如果您正在使用SQL-Server,则可以使用COUNT窗口函数:
SELECT UserName, UserId, COUNT(UserId) OVER (PARTITION BY UserName) AS Counts
FROM UserTable
然后只挑选计数大于1的那些:
SELECT * FROM (
SELECT UserName, UserId, COUNT(UserId) OVER (PARTITION BY UserName) AS Counts
FROM UserTable
) rows
WHERE rows.Counts > 1
要使它们进入第二种格式,您需要使用一些row concatenation strategy - FOR XML PATH是一种流行的格式。
答案 1 :(得分:1)
您可以使用FOR XML PATH:
Select UserName, COUNT(*),
substring(
(
Select ','+clientID AS [text()]
From UserTable UTI
Where UTI.UserName = UTO.UserName
ORDER BY UTI.clientID
For XML PATH ('')
), 2, 1000)
From UserTable UTO
group by UserName
having COUNT(*) > 1
order by COUNT(*) desc