Агрегатные функции

CUBE

Разберем другой встроенный набор группирования - 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_idcategory_idprice
12621500.00
22622900.00
32623500.00
42717800.00
54620000.00
64837000.00
74975600.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_idcategory_idprice_minprice_max
12621500.0023500.00
22717800.0017800.00
32NULL17800.0023500.00
44620000.0020000.00
54837000.0037000.00
64975600.0075600.00
74NULL20000.0075600.00
8NULL620000.0023500.00
9NULL717800.0017800.00
10NULL837000.0037000.00
11NULL975600.0075600.00
12NULLNULL17800.0075600.00

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

#city_idcategory_idprice_minprice_max
12621500.0023500.00
22717800.0017800.00
44620000.0020000.00
54837000.0037000.00
64975600.0075600.00

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

Строки

#city_idcategory_idprice_minprice_max
32NULL17800.0023500.00
74NULL20000.0075600.00

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

Строки

#city_idcategory_idprice_minprice_max
8NULL620000.0023500.00
9NULL717800.0017800.00
10NULL837000.0037000.00
11NULL975600.0075600.00

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

Строка

#city_idcategory_idprice_minprice_max
12NULLNULL17800.0075600.00

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

    ПредыдущаяСледующая