Разберем другой встроенный набор группирования - CUBE. CUBE работает аналогично ROLLUP, только выполняет группировку по всевозможным подмножествам переданного списка выражений.

Например, для GROUP BY CUBE (a, b, c) результатом запроса будет объединение результатов GROUP BY по

  • a, b, c;
  • a, b;
  • a, c;
  • b, c;
  • a;
  • b;
  • c;
  • по всем строкам.

Синтаксис CUBE:

GROUP BY CUBE (выражение1, выражение2, ... , выражениеN)

Рассмотрим пример. Получим минимальную и максимальную цены на товары в городах с идентификаторами 2 и 4 по:

  • городу и категории товара;
  • только по городу;
  • только по категории товара;
  • по всем строкам.

Исходные данные:

SELECT sa.city_id, 
       p.category_id,
       pp.price
  FROM product_price pp
  JOIN product p
    ON p.product_id = pp.product_id
  JOIN store_address sa
    ON sa.store_id = pp.store_id
 WHERE sa.city_id IN (2, 4)
 ORDER BY sa.city_id,
          p.category_id,
          pp.price
city_id category_id price
1 2 6 21500.00
2 2 6 22900.00
3 2 6 23500.00
4 2 7 17800.00
5 4 6 20000.00
6 4 8 37000.00
7 4 9 75600.00

Добавим GROUP BY CUBE (sa.city_id, p.category_id):

SELECT sa.city_id, 
       p.category_id,
       min(pp.price) AS price_min,
       max(pp.price) AS price_max
  FROM product_price pp
  JOIN product p
    ON p.product_id = pp.product_id
  JOIN store_address sa
    ON sa.store_id = pp.store_id
 WHERE sa.city_id IN (2, 4)
 GROUP BY CUBE (sa.city_id, p.category_id)
 ORDER BY sa.city_id NULLS LAST,
          p.category_id NULLS LAST
# city_id category_id price_min price_max
1 2 6 21500.00 23500.00
2 2 7 17800.00 17800.00
3 2 NULL 17800.00 23500.00
4 4 6 20000.00 20000.00
5 4 8 37000.00 37000.00
6 4 9 75600.00 75600.00
7 4 NULL 20000.00 75600.00
8 NULL 6 20000.00 23500.00
9 NULL 7 17800.00 17800.00
10 NULL 8 37000.00 37000.00
11 NULL 9 75600.00 75600.00
12 NULL NULL 17800.00 75600.00

Повнимательнее рассмотрим результат выполнения запроса. В полученном результате строки

# city_id category_id price_min price_max
1 2 6 21500.00 23500.00
2 2 7 17800.00 17800.00
4 4 6 20000.00 20000.00
5 4 8 37000.00 37000.00
6 4 9 75600.00 75600.00

получены в результате GROUP BY sa.city_id, p.category_id.

Строки

# city_id category_id price_min price_max
3 2 NULL 17800.00 23500.00
7 4 NULL 20000.00 75600.00

получены в результате GROUP BY sa.city_id (итоги по городам).

Строки

# city_id category_id price_min price_max
8 NULL 6 20000.00 23500.00
9 NULL 7 17800.00 17800.00
10 NULL 8 37000.00 37000.00
11 NULL 9 75600.00 75600.00

получены в результате GROUP BY p.category_id (итоги по категориям).

Строка

# city_id category_id price_min price_max
12 NULL NULL 17800.00 75600.00

является результатом вычисления итогов по всем строкам.

4.11 ROLLUP

4.13 GROUPING SETS