Using ROLLUP in BigQuery

Senior Data Engineer • Contractor / Freelancer • GCP & AWS Certified
Search for a command to run...

Senior Data Engineer • Contractor / Freelancer • GCP & AWS Certified
No comments yet. Be the first to comment.
Short, practical posts on SQL and BigQuery — from core language features to advanced query patterns. A reference for data practitioners at every level.
Here's a useful Dataform concept: pre_operations and post_operations. As the name implies, these represent a set of actions that run before and after the main operation (table, view, or SQL operations

BigQuery has always been a SQL engine for tabular data. Object tables add an interesting twist to that. Instead of rows containing values, an object table gives you one row per file — pointing at da

Query your data lake with warehouse-grade security and performance — without moving a single file.

Ever run a heavy BigQuery SQL query, processed gigabytes of data — and then accidentally closed the tab or forgot to save the results? 😬 Don't re-run it. Your results are still there. BigQuery automa

You can use query parameters in BigQuery hashtag#SQL (now in the console as well!) — but how are they different from variables, and when should you use each? Both parameters and variables act as place

Today's short post is about using the #ROLLUP command in #BigQuery#SQL. Funnily enough, I haven't encountered it until recently, and not yet in the wild anyway. That doesn't mean it's not useful though.
🔍 What is ROLLUP? The ROLLUP function provides a way to do hierarchical aggregation in SQL. It allows us to create subtotals and grand totals in one query, rather than multiple queries.
Imagine you're grouping by several columns a,b, and c to compute an aggregate. GROUP BY ROLLUP(a,b,c) will perform an aggregation across the following sets:
-(a, b, c)
-(a, b)
-(a)
-()
🌟 Let's see an example:
Consider a sales table with columns Region, Product, and SalesAmount.
A standard GROUP BY might look like this:
SELECT Product, Region, SUM(SalesAmount) as total_sales
FROM sales
GROUP BY Product, Region;
This would produce a sum of Sales Amount per each product-region combination.
+------------+--------+-------------+
| Product | Region | total_sales |
+------------+--------+-------------+
| Headphones | Europe | 100 |
| Keyboard | Europe | 150 |
| Webcam | Europe | 200 |
| Headphones | Asia | 200 |
| Keyboard | Asia | 300 |
| Webcam | Asia | 400 |
+------------+--------+-------------+
At the same time, including ROLLUP would look like:
SELECT Region, Product, SUM(SalesAmount)
FROM sales
GROUP BY ROLLUP (Region, Product)
This would produce a sum of Sales Amount per each product-region combination as well, but also a row for each Region's sub-total and a grant total row for all regions.
+--------+------------+-------------+
| Region | Product | total_sales |
+--------+------------+-------------+
| | | 1350 |
| Europe | | 450 |
| Europe | Headphones | 100 |
| Europe | Keyboard | 150 |
| Europe | Webcam | 200 |
| Asia | | 900 |
| Asia | Headphones | 200 |
| Asia | Keyboard | 300 |
| Asia | Webcam | 400 |
+--------+------------+-------------+
⚠ The order of columns in the ROLLUP matters.
ROLLUP BY (Product, Region) would produce sub-totals by Product instead of subtotals by Region.
+------------+--------+-------------+
| Product | Region | total_sales |
+------------+--------+-------------+
| | | 1350 |
| Headphones | | 300 |
| Headphones | Europe | 100 |
| Keyboard | | 450 |
| Keyboard | Europe | 150 |
| Webcam | | 600 |
| Webcam | Europe | 200 |
| Headphones | Asia | 200 |
| Keyboard | Asia | 300 |
| Webcam | Asia | 400 |
+------------+--------+-------------+
Thanks for reading and keep discovering BigQuery!
Found it useful? Subscribe to my Analytics newsletter at notjustsql.com.