求助:SQL Server 2012如何将多行数据合并为一行
嘿,我来帮你搞定这个SQL统计的需求!
先理清楚已知信息
根据你提供的内容,我整理下关键信息:
- 你使用的是SQL Server 2012
- 你的表格包含这些列:
PatientId(患者ID)、VisitDate(访视日期)、VisitType(访视类型) - 访视类型的可选值:Completed、Bumped、No Show、Late Cancelled、Cancelled
- 你需要的输出是按
VisitDate分组,每个访视类型作为单独列,统计对应日期下各类型的访视数量(也就是行转列的统计结果)
解决方案
在SQL Server 2012里,有两种简单的方式可以实现这个需求,我都给你列出来:
方法1:使用PIVOT运算符
这种方式是SQL里专门用来行转列的语法,代码如下:
SELECT VisitDate, ISNULL(Completed, 0) AS Completed, ISNULL(Bumped, 0) AS Bumped, ISNULL([No Show], 0) AS [No Show], ISNULL([Late Cancelled], 0) AS [Late Cancelled], ISNULL(Cancelled, 0) AS Cancelled FROM ( SELECT VisitDate, VisitType, COUNT(PatientId) AS VisitCount FROM YourTableName -- 这里替换成你的实际表名 GROUP BY VisitDate, VisitType ) AS SourceTable PIVOT ( SUM(VisitCount) FOR VisitType IN ( Completed, Bumped, [No Show], [Late Cancelled], Cancelled ) ) AS PivotTable ORDER BY VisitDate;
方法2:条件聚合(更灵活,兼容更早版本)
如果你觉得PIVOT有点难理解,条件聚合的写法更直观,代码如下:
SELECT VisitDate, SUM(CASE WHEN VisitType = 'Completed' THEN 1 ELSE 0 END) AS Completed, SUM(CASE WHEN VisitType = 'Bumped' THEN 1 ELSE 0 END) AS Bumped, SUM(CASE WHEN VisitType = 'No Show' THEN 1 ELSE 0 END) AS [No Show], SUM(CASE WHEN VisitType = 'Late Cancelled' THEN 1 ELSE 0 END) AS [Late Cancelled], SUM(CASE WHEN VisitType = 'Cancelled' THEN 1 ELSE 0 END) AS Cancelled FROM YourTableName -- 这里替换成你的实际表名 GROUP BY VisitDate ORDER BY VisitDate;
小提示
- 一定要把代码里的
YourTableName换成你实际使用的表格名称哦; - 我用了
ISNULL(方法1)和条件判断里的ELSE 0(方法2),这样就算某一天没有某个类型的访视,也会显示0而不是NULL,和你期望的输出完全匹配; - 最后加了
ORDER BY VisitDate,保证结果是按日期排序的。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

