Reputation: 239
I have a Table where i need to perform aggregation. Example please refer below table
Region Country State City ValueX ValueY SEC
A B D 1 10 10 aaa
A B D 2 10 10 bbb
A B E 3 10 10 ccc
A C F 4 10 10 ddd
A C F 5 10 10 eee
A C G 6 10 10 fff
From the above table I need SUM of values after group by for columns Region, Country, State
Expected output table
Place ValueX ValueY SEC
D 20 20 aaa
D 20 20 bbb
E 10 10 ccc
F 20 20 ddd
F 20 20 eee
G 10 10 fff
B 30 30 aaa
B 30 30 bbb
B 30 30 ccc
C 30 30 ddd
C 30 30 eee
C 30 30 fff
A 60 60 aaa
A 60 60 bbb
A 60 60 ccc
A 60 60 ddd
A 60 60 eee
A 60 60 fff
I tried to use groupby with SUM function but this gives me a single row and I have no idea on how this value can be populated on table.
CREATE OR REPLACE TABLE MY_TABLE (
Region VARCHAR
,Country VARCHAR
,State VARCHAR
,City INT
,ValueX INT
,ValueY INT
,SEC VARCHAR
)
AS
SELECT *
FROM VALUES
('A','B','D',1,10,10,'aaa')
,('A','B','D',2,10,10,'bbb')
,('A','B','E',3,10,10,'ccc')
,('A','C','F',4,10,10,'ddd')
,('A','C','F',5,10,10,'eee')
,('A','C','G',6,10,10,'fff')
;
SELECT State, SUM(ValueX) FROM MY_TABLE GROUP BY State;
SELECT State, SUM(ValueY) FROM MY_TABLE GROUP BY State;
Please suggest if there is any easy method.
Upvotes: 0
Views: 2823
Reputation: 2059
You should be interested in the syntax: GROUP BY GROUPING SETS, GROUP BY CUBE and GROUP BY ROLLUP
Solution proposals:
WITH cte AS (
SELECT COALESCE(State, Country, Region) AS Place, SUM(ValueX) AS ValueX, SUM(ValueY) AS ValueY
FROM MY_TABLE
GROUP BY GROUPING SETS (Region, Country, State)
)
SELECT T1.Place, T1.ValueX, T1.ValueY, T2.SEC
FROM cte AS T1
LEFT JOIN MY_TABLE AS T2 ON T1.Place = T2.State OR T1.Place = T2.Country OR T1.Place = T2.Region;
WITH cte AS (
SELECT COALESCE(State, Country, Region) AS Place, SUM(ValueX) AS ValueX, SUM(ValueY) AS ValueY
FROM MY_TABLE
GROUP BY CUBE (Region, Country, State)
)
SELECT DISTINCT T1.Place, T1.ValueX, T1.ValueY, T2.SEC
FROM cte AS T1
LEFT JOIN MY_TABLE AS T2 ON T1.Place = T2.State OR T1.Place = T2.Country OR T1.Place = T2.Region
WHERE T1.Place IS NOT NULL;
WITH cte AS (
SELECT COALESCE(State, Country, Region) AS Place, SUM(ValueX) AS ValueX, SUM(ValueY) AS ValueY
FROM MY_TABLE
GROUP BY ROLLUP (Region, Country, State)
)
SELECT T1.Place, T1.ValueX, T1.ValueY, T2.SEC
FROM cte AS T1
LEFT JOIN MY_TABLE AS T2 ON T1.Place = T2.State OR T1.Place = T2.Country OR T1.Place = T2.Region
WHERE T1.Place IS NOT NULL;
Upvotes: 2