sql-server - SQL FOR XML PATH 列表和 COUNT

标签 sql-server for-xml-path

我有一张 table ,例如:

|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]

还有更优雅的查询吗?

最佳答案

SELECT  [Date], 
        COUNT(*) AS [Count],
        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]

如果您认为名称列可能包含 <>'"&你应该这样做:

SELECT  [Date], 
        COUNT(*) AS [Count],
        STUFF((
            SELECT ', ' + [Name]
            FROM #table t2
            WHERE t2.[Date] = t.[Date]
            ORDER BY [Name]
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)'), 1, 2, '') AS [Names]
FROM #table t
GROUP BY [Date]

关于sql-server - SQL FOR XML PATH 列表和 COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074321/

相关文章:

sql-server - XML 路径聚合 : one subquery for multiple `selects` on same subset

sql-server - 如何 : Interpret the MSSQL CDC "__$update_mask" field

sql - 获取指定日期的上一个星期二(或一周中的任何给定日期)

sql-server - 使用 T-SQL FOR XML PATH 删除空的 XML 节点

sql-server - 从 SQL 表创建 XML(唯一的 XML 格式)

sql-server - 在sql server中将 “&lt;”和 “&gt;”替换为 “<”和 “>”

SQL Server - 数据库设计 - 数据完整性 - 强制属性值 W/O 触发器

c# - 可以从 SOAP UI 使用服务,但是调用该服务的 SQL Clr 不起作用

SQL Server 交叉应用不起作用?

sql - 如何在 SQL Server 2008+ 中使用 ORDER BY 和 FOR XML SELECT DISTINCT