Reading this following post is important in order to understand how CUBE works.
We saw detailed discussion in this blog post about GROUPING SETS in Postgres and how they improve the GROUP BY clause.
How To Use GROUPING SETS To Boost GROUP BY Queries In Postgres?
A shorthand notation is provided for specifying two common types of grouping set. A clause of the form CUBE and a clause of the form ROLLUP.
Postgres CUBE
The CUBE allows you to generate multiple grouping sets.
Syntax
SELECT
column_1,
column_2,
column_3,
aggregate (column_4)
FROM
table
GROUP BY
CUBE (column_1, column_2, column_3);
The last CUBE part is equivalent to
GROUPING SETS (
( column_1, column_2, column_3),
( column_1, column_2 ),
( column_1, column_3 ),
( column_1),
( column_2, column_3 ),
( column_2 ),
( column_3 ),
( )
)
Let's say the number of columns specified in the CUBE is n then it will make 2n combinations.
Also, you can partially perform the CUBE operation as well.
Just like this
SELECT
column_1,
column_2,
column_3,
aggregate (column_4)
FROM
table
GROUP BY
CUBE (column_1, column_2);
Example
I will be using this database for all examples which is available on my Github public repo
SELECT
ship_city,
ship_country,
SUM (freight)
FROM
orders
GROUP BY
CUBE (ship_city, ship_country);
//Output
ship_city, ship_country, SUM
null null 64942.74
"Seattle" "USA" 1353.0599
"Kirkland" "USA" 70.009995
...
...
162 rows
Partial CUBE Example
SELECT
ship_city,
ship_country,
SUM (freight)
FROM
orders
GROUP BY
ship_city,
CUBE (ship_country);
//Output
ship_city, ship_country, SUM
"Seattle" "USA" 1353.0599
"Kirkland" "USA" 70.009995
"Paris" "France" 108.28
...
...
140 rows
Credit: PostgreSQL Docs
CUBE database examples sql query