如何在SQL同一列中显示分组统计的日期与计数?
解决SQL中将日期与计数合并为单一格式化列的问题
嘿,我来帮你搞定这个需求!首先提个小细节:你原查询里group by CardIssueDate但select里写的是IssueDate,这大概率是笔误,得把字段名统一(比如都用IssueDate或者CardIssueDate),不然会报错哦。
接下来分两种情况给你方案,适配不同的SQL Server版本:
方案1:SQL Server 2017及以上版本(推荐)
用STRING_AGG函数可以轻松完成字符串拼接,这是官方推荐的现代写法:
SELECT 'IssueDate: ' + STRING_AGG(CONCAT(IssueDate, ' (', cnt, ')'), ' ') AS Result FROM ( -- 先分组统计每个日期的记录数 SELECT TOP 5 IssueDate, COUNT(IssueDate) AS cnt FROM employee (NOLOCK) GROUP BY IssueDate ORDER BY COUNT(IssueDate) DESC ) AS DateCounts
解释:
- 子查询先按
IssueDate分组,统计每个日期的计数,取Top5按计数降序排列; - 外层用
CONCAT把日期和计数拼成YYYY-MM-DD (数字)的格式; - 再用
STRING_AGG把所有拼接好的片段用空格连接,最后加上前缀IssueDate:。
方案2:SQL Server 2016及更早版本
如果你的版本不支持STRING_AGG,可以用FOR XML PATH的老方法来实现拼接:
SELECT 'IssueDate: ' + STUFF( ( SELECT ' ' + CONCAT(IssueDate, ' (', cnt, ')') FROM ( SELECT TOP 5 IssueDate, COUNT(IssueDate) AS cnt FROM employee (NOLOCK) GROUP BY IssueDate ORDER BY COUNT(IssueDate) DESC ) AS DateCounts FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS Result
解释:
- 子查询同样先统计Top5的日期和计数;
- 内层
FOR XML PATH('')会把每条记录的拼接结果连起来,前面加空格; STUFF函数用来去掉开头多余的第一个空格,最后加上前缀IssueDate:。
两种方案最终都会输出你想要的格式:IssueDate: 2015-09-11 (23) 2015-09-29 (89) 2015-08-20 (78) 2016-06-08 (2) 2015-10-29 (234)
内容的提问来源于stack exchange,提问作者Kumee
相关产品推荐
相关产品推荐

