You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:33:16