Skip to content

Grouping data

GROUP BY

the GROUP BY clause groups a set of rows into a set of summary rows by values of columns or expressions. It returns one row for each group.

SELECT 
    c1, c2,..., cn, aggregate_function(ci)
FROM
    table
WHERE
    where_conditions
GROUP BY c1 , c2,...,cn;

The GROUP BY clause must appear after FROM and WHERE clauses.

SELECT 
    status, COUNT(*)
FROM
    orders
GROUP BY status;

It also allows to sort the groups:

SELECT 
    status, COUNT(*)
FROM
    orders
GROUP BY status DESC;

HAVING

The HAVING clause is often used with the GROUP BY to filter groups based on a specific condition. If it' s ommited, HAVING behaves like WHERE.

SELECT 
    ordernumber,
    SUM(quantityOrdered) AS itemsCount,
    SUM(priceeach*quantityOrdered) AS total
FROM
    orderdetails
GROUP BY ordernumber
HAVING total > 1000;

ROLLUP

A grouping set is a set of columns to which you want to group. The ROLLUP clause is an extension of the GROUP BY clause with the following syntax:

SELECT 
    select_list
FROM 
    table_name
GROUP BY
    c1, c2, c3 WITH ROLLUP;

The ROLLUP generates multiple grouping sets based on the columns or expression specified in the GROUP BY clause.

GROUPING function

To check whether NULL in the results set represents the subtotals or grand totals, you can use GROUPING() function. The GROUPING function will return 1 when NULL occurs in a supper-aggregate row, otherwise it will return 0.

SELECT 
    IF(GROUPING(orderYear),
        'All Years',
        orderYear) orderYear,
    IF(GROUPING(productLine),
        'All Product Lines',
        productLine) productLine,
    SUM(orderValue) totalOrderValue
FROM
    sales
GROUP BY 
    orderYear , 
    productline 
WITH ROLLUP;