PostgreSQL CUBE is a sub-clause of the GROUP BY clause which allows us to generate multiple grouping sets.
As we know grouping set is a set of columns to which you want to group, but we can not create multiple grouping set in a single statement (multiple statements may be the cause of slow query performance), CUBE sub-clause resolve these issues.
Syntax of the CUBE sub-clause:
SELECT c1, c2, c3, aggregate (c4) FROM table_name GROUP BY CUBE (c1, c2, c3); |
The query is the same as GROUP BY except we added a new CUBE sub-clause after GROUP BY clause. The query statement generates all possible grouping sets based on the dimension columns specified in CUBE. If the number of columns specified in the CUBE is n, then you will get the result in 2n combinations.
Note: PostgreSQL allows you to perform a partial cube to reduce the number of aggregates calculated.
We can understand the use of the CUBE sub-clause by example.
Suppose we have a PRODUCTS table with columns like product name, category, quantity, etc.
CREATE TABLE products ( product_id serial NOT NULL, product_name text, category text, quantity numeric ); -- Inserted some records into PRODUCTS table INSERT INTO products(product_name, category, quantity) VALUES('prod_1','category_1',100); INSERT INTO products(product_name, category, quantity) VALUES('prod_2','category_2',200); INSERT INTO products(product_name, category, quantity) VALUES('prod_3','category_3',400); INSERT INTO products(product_name, category, quantity) VALUES('prod_4','category_4',500); |
CUBE sub-clause by example
SELECT product_name, category, SUM(quantity) FROM products GROUP BY CUBE (product_name,category) ORDER BY product_name, category; |
Result:
The following query performs a partial cube:
SELECT product_name, category, SUM(quantity) FROM products GROUP BY product_name, CUBE(category) ORDER BY product_name, category; |
Result: