【发布时间】:2011-05-20 15:41:29
【问题描述】:
我有一张桌子,例如:
|Date |Name|
--------------------
|'20-May-2011'|Bob |
|'20-May-2011'|Fred|
|'20-May-2011'|Jim |
|'21-May-2011'|Bob |
|'21-May-2011'|Ed |
|'22-May-2011'|Bill|
我需要一个查询来返回:
|Date |Count|Names |
--------------------------------------
|'20-May-2011'| 3|'Bob, Fred, Jim'|
|'21-May-2011'| 2|'Bob, Ed' |
|'22-May-2011'| 1|'Bill' |
换句话说,我想要一个列表和按日期计算的名称。 我能想到的最好的是:
SELECT list.[Date], [Count], [Names]
FROM (
SELECT [Date],
STUFF((
SELECT ', ' + [Name]
FROM #table t2
WHERE t2.[Date] = t.[Date]
ORDER BY [Name]
FOR XML PATH('')
), 1, 2, '') AS [Names]
FROM #table t
GROUP BY [Date]
) [list]
INNER JOIN (
SELECT [Date],
COUNT(*) AS [Count]
FROM #table t
GROUP BY [Date]
) [count]
ON list.[Date] = count.[Date]
ORDER BY [Count] DESC, list.[Date]
还有更优雅的查询吗?
【问题讨论】:
-
不,我认为目前对于 SQL Server 来说没有更简单或“更优雅”的代码
-
劳伦斯,我不确定你的意思。这是直接针对服务器执行的事务 SQL。
-
我基本上想知道是否可以在一个查询中执行此操作,而不是将两个子查询连接在一起。