GroupBy查询除分组子句外还显示相关数据

时间:2014-07-24 17:22:27

标签: sql tsql

呃,我知道这是一个糟糕的头衔,但我想不出用一种简单的陈述来总结我的问题的方法。这是一个相当基本的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

感谢任何帮助。

2 个答案:

答案 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