Search code examples
sqlgroup-bynull

Group By clause returning too many rows


I have a table I'm trying to sort by column values in Stage.

It looks something like this:

CaseID Stage EventDate
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

I'm trying to organize the data by the Stage so that only the latest EventDate is shown - something like this:

CaseID A B C
1 01/01/10 01/04/10 01/05/10
2 02/01/10 02/02/10 02/05/10

I did a group by statement

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

But this returned too many rows with NULL placeholders:

CaseID A B C
1 01/01/10 NULL NULL
1 NULL 01/04/10 NULL
1 NULL NULL 01/05/10
2 02/01/10 NULL NULL
2 NULL 02/02/10 NULL
2 NULL NULL 02/05/10

I'd like for each row to condense, but I don't know where I went wrong. I've seen other questions with similar questions, but they all seemed to have issues with joint tables showing duplicate results.

Any suggestions would be helpful


Solution

  • You want one result row per CaseID, so GROUP BY CaseID only. Then use conditional aggregation, i.e. put the conditions inside 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;