SQL使用PIVOT行转列时同组数据未合并返回null如何解决
问题定位
PIVOT有个很容易踩的隐式规则:它会自动把数据源里既没做聚合、也没指定为转列字段的所有列,全当成分组键来做聚合。
你的子查询把COMEFROM字段也带进去了,这个字段既不参与ANSWER的最大值计算,也不是要转成列的QUESTION字段,所以实际执行时PIVOT是按CASEID + VISITDATE + COMEFROM三个字段联合分组的。看样例数据就能发现,同一次就诊下Q1对应COMEFROM是H、Q2是O、Q3是B,三个值完全不同,自然无法合并到同一行,最终出现每行仅一个问题列有值、其余列为null的结果。
正确实现
方案1:修正原有PIVOT写法
核心是在PIVOT的前置数据源里,只保留分组、转列、聚合必须的字段,把多余的COMEFROM剔除即可:
SELECT CaseID, Visitdate, [Q1], [Q2], [Q3] FROM ( -- 仅保留必要字段,移除无关的COMEFROM SELECT CaseID, Visitdate, Question, ANSWER FROM DATA ) as v PIVOT ( MAX(ANSWER) FOR Question IN ([Q1], [Q2], [Q3]) ) as p
方案2:通用条件聚合写法(兼容性更强)
如果需要适配不支持PIVOT语法的数据库,用标准SQL的条件聚合也能实现相同效果,分组逻辑完全可控,不容易出隐式规则的坑:
SELECT CaseID, Visitdate, MAX(CASE WHEN Question = 'Q1' THEN ANSWER END) AS Q1, MAX(CASE WHEN Question = 'Q2' THEN ANSWER END) AS Q2, MAX(CASE WHEN Question = 'Q3' THEN ANSWER END) AS Q3 FROM DATA GROUP BY CaseID, Visitdate
内容的提问来源于stack exchange,提问作者陳冠儒
相关产品推荐
相关产品推荐

