SQL条件聚合未返回全部预期行问题排查求助
问题分析与解决方案
首先,你遇到的问题核心在于分组逻辑和预期不匹配。看你给出的示例数据,两行的ListID都是1,而你的查询是按ListID分组聚合——这意味着所有ListID=1的行都会被合并成一行,所以实际返回1行是完全符合SQL分组聚合逻辑的。
你预期返回两行,说明你的表中这两组数据(Prob=2/Impa=3和Prob=5/Impa=5)应该有一个额外的区分字段,用来把它们分成不同的组。比如可能存在一个ResponseID、RowNumber或者其他标识,用来标记同一个ListID下的不同风险响应记录。
修正后的查询思路
你需要找到那个能区分这两行的字段(假设叫ResponseGroupID),把它加入到GROUP BY子句中,同时在SELECT里也包含它:
SELECT ListID, ResponseGroupID, -- 这个是区分同一ListID下不同行的字段 MAX(CASE WHEN QuestionName = 'Probability Value' THEN Answer END) AS 'prob', MAX(CASE WHEN QuestionName = 'Impact Value' THEN Answer END) As 'impa', MAX(CASE WHEN QuestionName = 'What is the Risk Response Strategy' THEN Answer END) AS 'strat', MAX(CASE WHEN QuestionName = 'Response Comment' THEN Answer END) AS 'rrap' FROM table1 GROUP BY ListID, ResponseGroupID -- 同时按两个字段分组
如果你的表中没有这样的显式字段,那可能需要用窗口函数来生成一个分组标识。比如假设同一ListID下,QuestionName的组合是成对出现的,你可以用ROW_NUMBER()来给每个组编号:
WITH numbered_rows AS ( SELECT ListID, QuestionName, Answer, -- 按ListID分区,按QuestionName排序,生成组编号 ROW_NUMBER() OVER (PARTITION BY ListID, QuestionName ORDER BY (SELECT NULL)) AS group_num FROM table1 ) SELECT ListID, group_num, MAX(CASE WHEN QuestionName = 'Probability Value' THEN Answer END) AS 'prob', MAX(CASE WHEN QuestionName = 'Impact Value' THEN Answer END) As 'impa', MAX(CASE WHEN QuestionName = 'What is the Risk Response Strategy' THEN Answer END) AS 'strat', MAX(CASE WHEN QuestionName = 'Response Comment' THEN Answer END) AS 'rrap' FROM numbered_rows GROUP BY ListID, group_num
额外提示
- 先检查你的原始表数据,确认同一
ListID下的两行数据到底有什么差异字段——这是解决问题的关键。 - 如果你的表是按“每行存储一个问题的答案”(即EAV模型),那么要拆分出同一记录的多个答案,必须有一个共同的“记录标识”字段,而不仅仅是
ListID。
内容的提问来源于stack exchange,提问作者Zac Watkins
相关产品推荐
相关产品推荐

