MySQL 8: Using ROLLUP modifier with GROUP BY clause

Updated: January 27, 2024 By: Guest Contributor Post a comment

Introduction

MySQL, a widely-used open-source relational database management system, provides an extensive range of features one of which is the ROLLUP modifier. The ROLLUP modifier is an extension of the GROUP BY clause that is used to produce a result set with subtotals and grand totals. This tutorial will introduce the concept of the ROLLUP modifier in MySQL, demonstrate how to use it with the GROUP BY clause through a series of examples, and provide insights into its practical applications.

What is ROLLUP used for?

The ROLLUP modifier is used in conjunction with the GROUP BY clause to generate multiple levels of subtotals moving from the most detailed up to a grand total. It empowers data analysis by allowing users to see data from different levels of aggregation with the same query. Implementing a ROLLUP through SQL queries simplifies the process of creating reports and analytics with cross-tabulation capabilities. Before diving into the specifics, ensure your MySQL server is running version 8 or later, as this tutorial is tailored for MySQL 8’s capabilities.

Basic Syntax of ROLLUP

Let’s start by understanding the basic syntax of the ROLLUP modifier:

SELECT column_list FROM table_name GROUP BY ROLLUP(column1, column2, ...);

Here, column_list specifies the columns you want to select and column1, column2, ... represent the columns you want to include in the ROLLUP for generating subtotals. Note that the order of columns in the ROLLUP expression is significant, as it dictates the hierarchical level of subtotals.

Example 1: Generating Subtotals

Consider a sales database with the following table:

CREATE TABLE sales (
    year INT,
    quarter INT,
    total_sales DECIMAL(10,2)
);

-- Insert sample data
INSERT INTO sales VALUES
(2020, 1, 35000),
(2020, 2, 12500),
(2020, 3, 18000),
(2020, 4, 27000);

Now let’s generate subtotals for each year and a grand total:

SELECT year, SUM(total_sales) AS annual_sales FROM sales GROUP BY ROLLUP(year);

The output will be:

+------+--------------+
| year | annual_sales |
+------+--------------+
| 2020 | 92500.00     |
| NULL | 92500.00     |
+------+--------------+

The first row represents the subtotal of sales for the year 2020, and the second row with NULL represents the grand total.

Example 2: Nested Subtotals

To generate subtotals for each year and each quarter within the year, adjust the ROLLUP as follows:

SELECT year, quarter, SUM(total_sales) AS quarterly_sales FROM sales GROUP BY ROLLUP(year, quarter);

Here’s the output:

+------+---------+----------------+
| year | quarter | quarterly_sales |
+------+---------+----------------+
| 2020 |       1 | 35000.00        |
| 2020 |       2 | 12500.00        |
| 2020 |       3 | 18000.00        |
| 2020 |       4 | 27000.00        |
| 2020 |    NULL | 92500.00        |
| NULL |    NULL | 92500.00        |
+------+---------+----------------+

This result set shows individual quarterly sales totals and a subtotal after every set of quarter results before culminating with the grand total.

Advanced ROLLUP Usage

Moving to more advanced use of the ROLLUP feature, you can employed complex expressions and filters within the query to achieve precise reporting requirements.

Example 3: Using ROLLUP with Filtering

Supposing you only need the annual and grand total sales over $15,000:

SELECT year, SUM(total_sales) AS filtered_sales FROM sales
GROUP BY ROLLUP(year) HAVING SUM(total_sales) > 15000;

This operation filters out any subtotal less than $15,000, with the following output:

+------+----------------+
| year | filtered_sales |
+------+----------------+
| 2020 | 92500.00       |
| NULL | 92500.00       |
+------+----------------+

The filtered result set gives precisely what we want—only the substantial totals.

Moreover, with user-defined variables in MySQL, you can recognize total or subtotal rows produced by ROLLUP, which may assist in formatting query results or further data processing in applications.

Conclusion

In this tutorial, we explored the ROLLUP modifier, an incredibly powerful feature that adds data summarization capabilities to MySQL queries. We reviewed basic configurations and advanced beyond the foundational syntax to fine-tune our reports. Employing ROLLUP proficiently in MySQL not only facilitates succinct analysis of groups and subsets within your data but efficiently drives informed decision-making processes.