I am trying to figure out how to write a single select that would give me all combinations of values for certain aggregations.
Let me give you an example of data:
COUNTRY PRODUCT VALUE
cz p1 5
cz p2 10
de p1 8
de p2 15
Let’s say I would like to get SUM
of values grouped by certain criteria for all possible combinations with two column values. The catch is, that ALL
values is also an option:
COUNTRY PRODUCT SUM(VALUE)
cz p1 5
cz p2 10
de p1 8
de p2 15
cz ALL 15
de ALL 23
ALL p1 13
ALL p2 25
ALL ALL 38
I know I can do this using multiple selects with different groupBy conditions like
SELECT "COUNTRY", "PRODUCT", SUM("VALUE") FROM "PRODUCTS"
SELECT "COUNTRY", "PRODUCT", SUM("VALUE") FROM "PRODUCTS" GROUP BY ("COUNTRY", "PRODUCT")
SELECT "COUNTRY", "PRODUCT", SUM("VALUE") FROM "PRODUCTS" GROUP BY ("COUNTRY")
SELECT "COUNTRY", "PRODUCT", SUM("VALUE") FROM "PRODUCTS" GROUP BY ("PRODUCT")
and combine the results.
But I wonder it it is possible to optimize this and select these combinations with single query. Sorry if this has been answered already, I did not find it.
3
Answers
It is about GROUPING_SETS-clause
https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-grouping-sets/
You are looking for
CUBE
:If your data is hierarchical (you want to analyze the data by country, or all countries combined, but not the total of each products), prefer the "GROUP BY ROLLUP" over the "GROUP BY CUBE" clause.
or