ParentSub Table:
ParentCode | SubCode | CompanyName |
---|---|---|
MEGA1 | MEGA1 | Megacorp |
MEGA1 | SUBC1 | Subsidiary Company |
MEGA1 | EASC1 | East Coast Operations |
MEGA1 | EURC1 | Europe Company |
BIGLY | ALPH1 | Alphabet Company |
BIGLY | BIGLY | Big Development |
HOTS1 | HOTS1 | Hot Dog Company |
I want:
Parent | Subsidiary | Name |
---|---|---|
MEGA1 | MEGA1 | Megacorp |
MEGA1 | SUBC1 | Subsidiary Company |
MEGA1 | EASC1 | East Coast Operations |
MEGA1 | EURC1 | Europe Company |
MEGA1 | NULL | 4 |
BIGLY | ALPH1 | Alphabet Company |
BIGLY | BIGLY | Big Development |
BIGLY | NULL | 2 |
Surely there is a way to make ROLLUP do this?
SELECT ParentCode, SubCode, CompanyName FROM ParentSub GROUP BY ParentCode WITH ROLLUP
I don’t want the COUNTs in the rows and I don’t want them in Aggregate functions until the group changes.
Advertisement
Answer
GROUPING SETS
might be better than ROLLUP
here, as you only want 2 levels of rollup and you miss out other levels.
We can also use GROUPING()
to check if a column has been aggregated. Note that COUNT
needs to be converted to varchar
to hold it in the same column
SELECT ParentCode, SubCode, CASE WHEN GROUPING(CompanyName) = 1 THEN CAST(COUNT(*) AS varchar(10)) ELSE CompanyName END AS CompanyName FROM ParentSub GROUP BY GROUPING SETS ( (ParentCode, SubCode, CompanyName), (ParentCode) );