{"id":7200,"date":"2018-08-31T09:37:03","date_gmt":"2018-08-31T16:37:03","guid":{"rendered":"http:\/\/www.mysqltutorial.org\/?page_id=7200"},"modified":"2023-12-31T02:12:26","modified_gmt":"2023-12-31T09:12:26","slug":"mysql-rollup","status":"publish","type":"page","link":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/","title":{"rendered":"MySQL ROLLUP"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to use the MySQL <code>ROLLUP<\/code> clause to generate subtotals and grand totals.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting up a sample table<\/h2>\n\n\n\n<p>The following statement <a href=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-create-table\/\">creates a new table<\/a> named <code>sales<\/code> that stores the order values summarized by product lines and years. The data comes from the <code>products<\/code>, <code>orders<\/code>, and <code>orderDetails<\/code> tables in the <a href=\"https:\/\/www.mysqltutorial.org\/getting-started-with-mysql\/mysql-sample-database\/\">sample database<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">CREATE<\/span> <span class=\"hljs-keyword\">TABLE<\/span> sales\n<span class=\"hljs-keyword\">SELECT<\/span>\n    productLine,\n    <span class=\"hljs-keyword\">YEAR<\/span>(orderDate) orderYear,\n    <span class=\"hljs-keyword\">SUM<\/span>(quantityOrdered * priceEach) orderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    orderDetails\n        <span class=\"hljs-keyword\">INNER<\/span> <span class=\"hljs-keyword\">JOIN<\/span>\n    orders <span class=\"hljs-keyword\">USING<\/span> (orderNumber)\n        <span class=\"hljs-keyword\">INNER<\/span> <span class=\"hljs-keyword\">JOIN<\/span>\n    products <span class=\"hljs-keyword\">USING<\/span> (productCode)\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span>\n    productLine ,\n    <span class=\"hljs-keyword\">YEAR<\/span>(orderDate);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following query returns all rows from the <code>sales<\/code> table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> sales;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">+------------------+-----------+------------+\r\n| productLine      | orderYear | orderValue |\r\n+------------------+-----------+------------+\r\n| Classic Cars     |      <span class=\"hljs-number\">2003<\/span> | <span class=\"hljs-number\">1374832.22<\/span> |\r\n| Classic Cars     |      <span class=\"hljs-number\">2004<\/span> | <span class=\"hljs-number\">1763136.73<\/span> |\r\n| Classic Cars     |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">715953.54<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2003<\/span> |  <span class=\"hljs-number\">348909.24<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2004<\/span> |  <span class=\"hljs-number\">527243.84<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">245273.04<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2003<\/span> |  <span class=\"hljs-number\">309784.20<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2004<\/span> |  <span class=\"hljs-number\">471971.46<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">172881.88<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2003<\/span> |  <span class=\"hljs-number\">222182.08<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2004<\/span> |  <span class=\"hljs-number\">337326.10<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">104490.16<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2003<\/span> |   <span class=\"hljs-number\">65822.05<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2004<\/span> |   <span class=\"hljs-number\">96285.53<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2005<\/span> |   <span class=\"hljs-number\">26425.34<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">2003<\/span> |  <span class=\"hljs-number\">376657.12<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">2004<\/span> |  <span class=\"hljs-number\">465390.00<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">182066.45<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2003<\/span> |  <span class=\"hljs-number\">619161.48<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2004<\/span> |  <span class=\"hljs-number\">854551.85<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2005<\/span> |  <span class=\"hljs-number\">323846.30<\/span> |\r\n+------------------+-----------+------------+\r\n<span class=\"hljs-number\">21<\/span> rows <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">set<\/span> (0.00 sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">MySQL ROLLUP Overview<\/h2>\n\n\n\n<p>A grouping set is a set of columns to which you want to group. For example, the following query creates a grouping set denoted by <code>(productline)<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    productline, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    productline;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">+------------------+-----------------+\r\n| productline      | totalOrderValue |\r\n+------------------+-----------------+\r\n| Classic Cars     |      <span class=\"hljs-number\">3853922.49<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">1121426.12<\/span> |\r\n| Planes           |       <span class=\"hljs-number\">954637.54<\/span> |\r\n| Ships            |       <span class=\"hljs-number\">663998.34<\/span> |\r\n| Trains           |       <span class=\"hljs-number\">188532.92<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">1024113.57<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">1797559.63<\/span> |\r\n+------------------+-----------------+\r\n<span class=\"hljs-number\">7<\/span> rows <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">set<\/span> (0.00 sec)\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following query creates an empty grouping set denoted by the <code>()<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">+-----------------+\r\n| totalOrderValue |\r\n+-----------------+\r\n|      <span class=\"hljs-number\">9604190.61<\/span> |\r\n+-----------------+\r\n<span class=\"hljs-number\">1<\/span> row <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">set<\/span> (0.00 sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you want to generate two or more grouping sets together in one query, you may use the <code><a href=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-union\/\">UNION ALL<\/a><\/code> operator as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    productline, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    productline \n<span class=\"hljs-keyword\">UNION<\/span> <span class=\"hljs-keyword\">ALL<\/span>\n<span class=\"hljs-keyword\">SELECT<\/span> \n    <span class=\"hljs-literal\">NULL<\/span>, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here&#8217;s the query output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">+------------------+-----------------+\r\n| productline      | totalOrderValue |\r\n+------------------+-----------------+\r\n| Classic Cars     |      <span class=\"hljs-number\">3853922.49<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">1121426.12<\/span> |\r\n| Planes           |       <span class=\"hljs-number\">954637.54<\/span> |\r\n| Ships            |       <span class=\"hljs-number\">663998.34<\/span> |\r\n| Trains           |       <span class=\"hljs-number\">188532.92<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">1024113.57<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">1797559.63<\/span> |\r\n| NULL             |      <span class=\"hljs-number\">9604190.61<\/span> |\r\n+------------------+-----------------+\r\n<span class=\"hljs-number\">8<\/span> rows <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">set<\/span> (0.00 sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Because the <code>UNION ALL<\/code> requires all queries to have the same number of columns, we added <code>NULL<\/code> in the select list of the second query to fulfill this requirement.<\/p>\n\n\n\n<p>The <code>NULL<\/code> in the <code>productLine<\/code> column identifies the total super-aggregate line.<\/p>\n\n\n\n<p>This query can generate the total order values by product lines and also the grand total row. However, it has two problems:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The query is quite lengthy.<\/li>\n\n\n\n<li>The performance of the query may not be good since the database engine has to internally execute two separate queries and combine the result sets into one.<\/li>\n<\/ol>\n\n\n\n<p>To fix these issues, you can use the <code>ROLLUP<\/code> clause.<\/p>\n\n\n\n<p>The <code>ROLLUP<\/code> clause is an extension of the <code><a href=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-group-by\/\">GROUP BY<\/a><\/code> clause with the following syntax:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    select_list\n<span class=\"hljs-keyword\">FROM<\/span> \n    table_name\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span>\n    c1, c2, c3 <span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>ROLLUP<\/code> generates multiple grouping sets based on the columns or expressions specified in the <code>GROUP BY<\/code> clause. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    productLine, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    productline <span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here is the output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">+------------------+-----------------+\r\n| productLine      | totalOrderValue |\r\n+------------------+-----------------+\r\n| Classic Cars     |      <span class=\"hljs-number\">3853922.49<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">1121426.12<\/span> |\r\n| Planes           |       <span class=\"hljs-number\">954637.54<\/span> |\r\n| Ships            |       <span class=\"hljs-number\">663998.34<\/span> |\r\n| Trains           |       <span class=\"hljs-number\">188532.92<\/span> |\r\n| Trucks and Buses |      <span class=\"hljs-number\">1024113.57<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">1797559.63<\/span> |\r\n| NULL             |      <span class=\"hljs-number\">9604190.61<\/span> |\r\n+------------------+-----------------+\r\n<span class=\"hljs-number\">8<\/span> rows <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-keyword\">set<\/span> (0.00 sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As clearly shown in the output, the <code>ROLLUP<\/code> clause generates not only the subtotals but also the grand total of the order values.<\/p>\n\n\n\n<p>If you have more than one column specified in the <code>GROUP BY<\/code> clause, the <code>ROLLUP<\/code> clause assumes a hierarchy among the input columns.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">GROUP BY c1, c2, c3 <span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>ROLLUP<\/code> assumes that there is the following hierarchy:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">c1 &gt; c2 &gt; c3<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>It generates the following grouping sets:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">(c1, c2, c3)\n(c1, c2)\n(c1)\n()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you have two columns specified in the <code>GROUP BY<\/code> clause:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">GROUP BY c1, c2 <span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>then the <code>ROLLUP<\/code> generates the following grouping sets:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">(c1, c2)\n(c1)\n()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>See the following query example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    productLine, \n    orderYear,\n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    productline, \n    orderYear \n<span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here is the output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">+------------------+-----------+-----------------+\r\n| productLine      | orderYear | totalOrderValue |\r\n+------------------+-----------+-----------------+\r\n| Classic Cars     |      <span class=\"hljs-number\">2003<\/span> |      <span class=\"hljs-number\">1374832.22<\/span> |\r\n| Classic Cars     |      <span class=\"hljs-number\">2004<\/span> |      <span class=\"hljs-number\">1763136.73<\/span> |\r\n| Classic Cars     |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">715953.54<\/span> |\r\n| Classic Cars     |      <span class=\"hljs-keyword\">NULL<\/span> |      <span class=\"hljs-number\">3853922.49<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2003<\/span> |       <span class=\"hljs-number\">348909.24<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2004<\/span> |       <span class=\"hljs-number\">527243.84<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">245273.04<\/span> |\r\n| Motorcycles      |      <span class=\"hljs-keyword\">NULL<\/span> |      <span class=\"hljs-number\">1121426.12<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2003<\/span> |       <span class=\"hljs-number\">309784.20<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2004<\/span> |       <span class=\"hljs-number\">471971.46<\/span> |\r\n| Planes           |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">172881.88<\/span> |\r\n| Planes           |      <span class=\"hljs-keyword\">NULL<\/span> |       <span class=\"hljs-number\">954637.54<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2003<\/span> |       <span class=\"hljs-number\">222182.08<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2004<\/span> |       <span class=\"hljs-number\">337326.10<\/span> |\r\n| Ships            |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">104490.16<\/span> |\r\n| Ships            |      <span class=\"hljs-keyword\">NULL<\/span> |       <span class=\"hljs-number\">663998.34<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2003<\/span> |        <span class=\"hljs-number\">65822.05<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2004<\/span> |        <span class=\"hljs-number\">96285.53<\/span> |\r\n| Trains           |      <span class=\"hljs-number\">2005<\/span> |        <span class=\"hljs-number\">26425.34<\/span> |\r\n| Trains           |      <span class=\"hljs-keyword\">NULL<\/span> |       <span class=\"hljs-number\">188532.92<\/span> |\r\n| Trucks <span class=\"hljs-keyword\">and<\/span> Buses |      <span class=\"hljs-number\">2003<\/span> |       <span class=\"hljs-number\">376657.12<\/span> |\r\n| Trucks <span class=\"hljs-keyword\">and<\/span> Buses |      <span class=\"hljs-number\">2004<\/span> |       <span class=\"hljs-number\">465390.00<\/span> |\r\n| Trucks <span class=\"hljs-keyword\">and<\/span> Buses |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">182066.45<\/span> |\r\n| Trucks <span class=\"hljs-keyword\">and<\/span> Buses |      <span class=\"hljs-keyword\">NULL<\/span> |      <span class=\"hljs-number\">1024113.57<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2003<\/span> |       <span class=\"hljs-number\">619161.48<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2004<\/span> |       <span class=\"hljs-number\">854551.85<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-number\">2005<\/span> |       <span class=\"hljs-number\">323846.30<\/span> |\r\n| Vintage Cars     |      <span class=\"hljs-keyword\">NULL<\/span> |      <span class=\"hljs-number\">1797559.63<\/span> |\r\n| <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-keyword\">NULL<\/span> |      <span class=\"hljs-number\">9604190.61<\/span> |\r\n+------------------+-----------+-----------------+\r\n<span class=\"hljs-number\">29<\/span> rows in set (<span class=\"hljs-number\">0.00<\/span> sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>ROLLUP<\/code> generates the subtotal row every time the product line changes and the grand total at the end of the result.<\/p>\n\n\n\n<p>The hierarchy in this case is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">productLine &gt; orderYear<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you reverse the hierarchy, for example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    orderYear,\n    productLine, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    orderYear,\n    productline\n<span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">+-----------+------------------+-----------------+\r\n| orderYear | productLine      | totalOrderValue |\r\n+-----------+------------------+-----------------+\r\n|      <span class=\"hljs-number\">2003<\/span> | Classic Cars     |      <span class=\"hljs-number\">1374832.22<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Motorcycles      |       <span class=\"hljs-number\">348909.24<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Planes           |       <span class=\"hljs-number\">309784.20<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Ships            |       <span class=\"hljs-number\">222182.08<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Trains           |        <span class=\"hljs-number\">65822.05<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">376657.12<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Vintage Cars     |       <span class=\"hljs-number\">619161.48<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">3317348.39<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Classic Cars     |      <span class=\"hljs-number\">1763136.73<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Motorcycles      |       <span class=\"hljs-number\">527243.84<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Planes           |       <span class=\"hljs-number\">471971.46<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Ships            |       <span class=\"hljs-number\">337326.10<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Trains           |        <span class=\"hljs-number\">96285.53<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">465390.00<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Vintage Cars     |       <span class=\"hljs-number\">854551.85<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">4515905.51<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Classic Cars     |       <span class=\"hljs-number\">715953.54<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Motorcycles      |       <span class=\"hljs-number\">245273.04<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Planes           |       <span class=\"hljs-number\">172881.88<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Ships            |       <span class=\"hljs-number\">104490.16<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Trains           |        <span class=\"hljs-number\">26425.34<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">182066.45<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Vintage Cars     |       <span class=\"hljs-number\">323846.30<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">1770936.71<\/span> |\r\n|      <span class=\"hljs-keyword\">NULL<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">9604190.61<\/span> |\r\n+-----------+------------------+-----------------+\r\n<span class=\"hljs-number\">25<\/span> rows in set (<span class=\"hljs-number\">0.00<\/span> sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>ROLLUP<\/code> generates the subtotal every time the year changes and the grand total at the end of the result set.<\/p>\n\n\n\n<p>The hierarchy in this example is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\">orderYear &gt; productLine\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">The GROUPING() function<\/h2>\n\n\n\n<p>To check whether <code>NULL<\/code> in the result set represents the subtotals or grand totals, you use the <code>GROUPING()<\/code> function.<\/p>\n\n\n\n<p>The <code>GROUPING()<\/code> function returns 1 when <code>NULL<\/code> occurs in a supper-aggregate row, otherwise, it returns 0.<\/p>\n\n\n\n<p>The <code>GROUPING()<\/code> function can be used in the select list, <code>HAVING<\/code> clause, and (as of MySQL 8.0.12 ) <code>ORDER BY<\/code> clause.<\/p>\n\n\n\n<p>Consider the following query:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    orderYear,\n    productLine, \n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue,\n    <span class=\"hljs-keyword\">GROUPING<\/span>(orderYear),\n    <span class=\"hljs-keyword\">GROUPING<\/span>(productLine)\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    orderYear,\n    productline\n<span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">+-----------+------------------+-----------------+---------------------+-----------------------+\r\n| orderYear | productLine      | totalOrderValue | GROUPING(orderYear) | GROUPING(productLine) |\r\n+-----------+------------------+-----------------+---------------------+-----------------------+\r\n|      <span class=\"hljs-number\">2003<\/span> | Classic Cars     |      <span class=\"hljs-number\">1374832.22<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Motorcycles      |       <span class=\"hljs-number\">348909.24<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Planes           |       <span class=\"hljs-number\">309784.20<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Ships            |       <span class=\"hljs-number\">222182.08<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Trains           |        <span class=\"hljs-number\">65822.05<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">376657.12<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | Vintage Cars     |       <span class=\"hljs-number\">619161.48<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2003<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">3317348.39<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">1<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Classic Cars     |      <span class=\"hljs-number\">1763136.73<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Motorcycles      |       <span class=\"hljs-number\">527243.84<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Planes           |       <span class=\"hljs-number\">471971.46<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Ships            |       <span class=\"hljs-number\">337326.10<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Trains           |        <span class=\"hljs-number\">96285.53<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">465390.00<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | Vintage Cars     |       <span class=\"hljs-number\">854551.85<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2004<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">4515905.51<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">1<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Classic Cars     |       <span class=\"hljs-number\">715953.54<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Motorcycles      |       <span class=\"hljs-number\">245273.04<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Planes           |       <span class=\"hljs-number\">172881.88<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Ships            |       <span class=\"hljs-number\">104490.16<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Trains           |        <span class=\"hljs-number\">26425.34<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Trucks <span class=\"hljs-keyword\">and<\/span> Buses |       <span class=\"hljs-number\">182066.45<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | Vintage Cars     |       <span class=\"hljs-number\">323846.30<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">0<\/span> |\r\n|      <span class=\"hljs-number\">2005<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">1770936.71<\/span> |                   <span class=\"hljs-number\">0<\/span> |                     <span class=\"hljs-number\">1<\/span> |\r\n|      <span class=\"hljs-keyword\">NULL<\/span> | <span class=\"hljs-keyword\">NULL<\/span>             |      <span class=\"hljs-number\">9604190.61<\/span> |                   <span class=\"hljs-number\">1<\/span> |                     <span class=\"hljs-number\">1<\/span> |\r\n+-----------+------------------+-----------------+---------------------+-----------------------+\r\n<span class=\"hljs-number\">25<\/span> rows in set (<span class=\"hljs-number\">0.00<\/span> sec)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>GROUPING(orderYear)<\/code> returns 1 when <code>NULL<\/code> in the <code>orderYear<\/code> column occurs in a super-aggregate row, 0 otherwise.<\/p>\n\n\n\n<p>Similarly, the <code>GROUPING(productLine)<\/code> returns 1 when <code>NULL<\/code> in the <code>productLine<\/code> column occurs in a super-aggregate row, 0 otherwise.<\/p>\n\n\n\n<p>We often use <code>GROUPING()<\/code> function to substitute meaningful labels for super-aggregate <code>NULL<\/code> values instead of displaying it directly.<\/p>\n\n\n\n<p>The following example shows how to combine the <code><a href=\"https:\/\/www.mysqltutorial.org\/mysql-control-flow-functions\/mysql-if-function\/\">IF()<\/a><\/code> function with the <code>GROUPING()<\/code> function to substitute labels for the super-aggregate <code>NULL<\/code> values in <code>orderYear<\/code> and <code>productLine<\/code> columns:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> \n    <span class=\"hljs-keyword\">IF<\/span>(<span class=\"hljs-keyword\">GROUPING<\/span>(orderYear),\n        <span class=\"hljs-string\">'All Years'<\/span>,\n        orderYear) orderYear,\n    <span class=\"hljs-keyword\">IF<\/span>(<span class=\"hljs-keyword\">GROUPING<\/span>(productLine),\n        <span class=\"hljs-string\">'All Product Lines'<\/span>,\n        productLine) productLine,\n    <span class=\"hljs-keyword\">SUM<\/span>(orderValue) totalOrderValue\n<span class=\"hljs-keyword\">FROM<\/span>\n    sales\n<span class=\"hljs-keyword\">GROUP<\/span> <span class=\"hljs-keyword\">BY<\/span> \n    orderYear , \n    productline \n<span class=\"hljs-keyword\">WITH<\/span> <span class=\"hljs-keyword\">ROLLUP<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The output is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+-----------+-------------------+-----------------+\r\n| orderYear | productLine       | totalOrderValue |\r\n+-----------+-------------------+-----------------+\r\n| 2003      | Classic Cars      |      1374832.22 |\r\n| 2003      | Motorcycles       |       348909.24 |\r\n| 2003      | Planes            |       309784.20 |\r\n| 2003      | Ships             |       222182.08 |\r\n| 2003      | Trains            |        65822.05 |\r\n| 2003      | Trucks and Buses  |       376657.12 |\r\n| 2003      | Vintage Cars      |       619161.48 |\r\n| 2003      | All Product Lines |      3317348.39 |\r\n| 2004      | Classic Cars      |      1763136.73 |\r\n| 2004      | Motorcycles       |       527243.84 |\r\n| 2004      | Planes            |       471971.46 |\r\n| 2004      | Ships             |       337326.10 |\r\n| 2004      | Trains            |        96285.53 |\r\n| 2004      | Trucks and Buses  |       465390.00 |\r\n| 2004      | Vintage Cars      |       854551.85 |\r\n| 2004      | All Product Lines |      4515905.51 |\r\n| 2005      | Classic Cars      |       715953.54 |\r\n| 2005      | Motorcycles       |       245273.04 |\r\n| 2005      | Planes            |       172881.88 |\r\n| 2005      | Ships             |       104490.16 |\r\n| 2005      | Trains            |        26425.34 |\r\n| 2005      | Trucks and Buses  |       182066.45 |\r\n| 2005      | Vintage Cars      |       323846.30 |\r\n| 2005      | All Product Lines |      1770936.71 |\r\n| All Years | All Product Lines |      9604190.61 |\r\n+-----------+-------------------+-----------------+<\/code><\/span><\/pre>\n\n\n<p>In this tutorial, you have learned how to use the MySQL <code>ROLLUP()<\/code> to generate multiple grouping sets considering a hierarchy between columns specified in the <code>GROUP BY<\/code> clause.<\/p>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful? <\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"7200\"\n\t\t\t\tdata-post-url=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/\"\n\t\t\t\tdata-post-title=\"MySQL ROLLUP\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"7200\"\n\t\t\t\tdata-post-url=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/\"\n\t\t\t\tdata-post-title=\"MySQL ROLLUP\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":174,"menu_order":23,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7200","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MySQL ROLLUP<\/title>\n<meta name=\"description\" content=\"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL ROLLUP\" \/>\n<meta property=\"og:description\" content=\"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/\" \/>\n<meta property=\"og:site_name\" content=\"MySQL Tutorial\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-31T09:12:26+00:00\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/mysql-rollup\\\/\",\"url\":\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/mysql-rollup\\\/\",\"name\":\"MySQL ROLLUP\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mysqltutorial.org\\\/#website\"},\"datePublished\":\"2018-08-31T16:37:03+00:00\",\"dateModified\":\"2023-12-31T09:12:26+00:00\",\"description\":\"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/mysql-rollup\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/mysql-rollup\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/mysql-rollup\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mysqltutorial.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL Basics\",\"item\":\"https:\\\/\\\/www.mysqltutorial.org\\\/mysql-basics\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"MySQL ROLLUP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mysqltutorial.org\\\/#website\",\"url\":\"https:\\\/\\\/www.mysqltutorial.org\\\/\",\"name\":\"MySQL Tutorial\",\"description\":\"A comprehensive MySQL Tutorial\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mysqltutorial.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MySQL ROLLUP","description":"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/","og_locale":"en_US","og_type":"article","og_title":"MySQL ROLLUP","og_description":"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.","og_url":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/","og_site_name":"MySQL Tutorial","article_modified_time":"2023-12-31T09:12:26+00:00","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/","url":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/","name":"MySQL ROLLUP","isPartOf":{"@id":"https:\/\/www.mysqltutorial.org\/#website"},"datePublished":"2018-08-31T16:37:03+00:00","dateModified":"2023-12-31T09:12:26+00:00","description":"Learn how to use MySQL ROLLUP() to generate multiple grouping sets considering a hierarchy between columns specified in GROUP BY.","breadcrumb":{"@id":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.mysqltutorial.org\/mysql-basics\/mysql-rollup\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mysqltutorial.org\/"},{"@type":"ListItem","position":2,"name":"MySQL Basics","item":"https:\/\/www.mysqltutorial.org\/mysql-basics\/"},{"@type":"ListItem","position":3,"name":"MySQL ROLLUP"}]},{"@type":"WebSite","@id":"https:\/\/www.mysqltutorial.org\/#website","url":"https:\/\/www.mysqltutorial.org\/","name":"MySQL Tutorial","description":"A comprehensive MySQL Tutorial","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mysqltutorial.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/pages\/7200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/comments?post=7200"}],"version-history":[{"count":5,"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/pages\/7200\/revisions"}],"predecessor-version":[{"id":13927,"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/pages\/7200\/revisions\/13927"}],"up":[{"embeddable":true,"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/pages\/174"}],"wp:attachment":[{"href":"https:\/\/www.mysqltutorial.org\/wp-json\/wp\/v2\/media?parent=7200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}