代码之家  ›  专栏  ›  技术社区  ›  sqlnoob

Group By子句返回的行太多

  •  1
  • sqlnoob  · 技术社区  · 2 年前

    我有一个表,我正在尝试按Stage中的列值进行排序。

    它看起来像这样:

    案例ID 阶段 事件日期
    1. A. 01/01/10
    1. B 01/03/10
    1. B 01/04/10
    1. C 01/05/10
    2. A. 02/01/10
    2. B 02/02/10
    2. C 02/03/10
    2. C 02/05/10

    我正在尝试按阶段组织数据,以便只有最新的 EventDate 显示-大致如下:

    案例ID A. B C
    1. 01/01/10 01/04/10 01/05/10
    2. 02/01/10 02/02/10 02/05/10

    我做了一个 group by 陈述

    SELECT 
        CaseID,
        CASE WHEN Stage = 'A' THEN MAX(EventDate) END AS A,
        CASE WHEN Stage = 'B' THEN MAX(EventDate) END AS B,
        CASE WHEN Stage = 'C' THEN MAX(EventDate) END AS C
    FROM
        StageTable
    GROUP BY 
        CaseID, Stage
    

    但这返回了太多带有NULL占位符的行:

    案例ID A. B C
    1. 01/01/10 无效的 无效的
    1. 无效的 01/04/10 无效的
    1. 无效的 无效的 01/05/10
    2. 02/01/10 无效的 无效的
    2. 无效的 02/02/10 无效的
    2. 无效的 无效的 02/05/10

    我想把每一排都浓缩一下,但我不知道哪里出了问题。我看到其他问题也有类似的问题,但它们似乎都有显示重复结果的联合表的问题。

    任何建议都会很有帮助

    1 回复  |  直到 2 年前
        1
  •  2
  •   Thorsten Kettner    2 年前

    您希望每个CaseID有一个结果行,因此 GROUP BY CaseID 只有然后使用条件聚合,即将条件放入 MAX() .

    SELECT
      CaseID
      ,MAX(CASE WHEN Stage = 'A' THEN EventDate END) AS A
      ,MAX(CASE WHEN Stage = 'B' THEN EventDate END) AS B
      ,MAX(CASE WHEN Stage = 'C' THEN EventDate END) AS C
    FROM StageTable
    GROUP BY CaseID
    ORDER BY CaseID;