Эквиваленты GROUPING SETS

Предложение GROUP BY с оператором GROUPING SETS может дать такой же результирующий набор, как и несколько простых предложений GROUP BY, объединенных с помощью UNION ALL. Оператор GROUPING SETS может дать результат, эквивалентный результату простой операции GROUP BY, операции ROLLUP или CUBE. Разные сочетания операций GROUPING SETS, ROLLUP или CUBE могут создавать эквивалентные результирующие наборы.

В этом разделе даны примеры эквивалентов оператора GROUPING SETS. В примерах используются следующие сокращения:

  • Agg(): любая статистическая функция;

  • (arg): аргумент.

Оператор GROUPING SETS, эквивалентный оператору UNION ALL

Предложение GROUPING SETS (<набор группирования> [,...n ]) в качестве списка GROUP BY — это то же самое, что оператор UNION ALL, объединяющий запросы, каждый из которых имеет в качестве списка GROUP BY один из наборов группирования. Статистические выражения для чисел с плавающей запятой могут возвращать немного другие результаты.

Следующие инструкции эквивалентны.

SELECT customer, year, SUM(sales)
FROM T
GROUP BY GROUPING SETS ((customer), (year))
SELECT customer, NULL as year, SUM(sales)
FROM T 
GROUP BY customer
UNION ALL
SELECT NULL as customer, year, SUM(sales)
FROM T 
GROUP BY year

Операторы GROUPING SETS, эквивалентные простому предложению GROUP BY

Следующие предложения возвращают одни и те итоговые суммы:

GROUP BY GROUPING SETS ( () )
GROUP BY ()

Следующие предложения возвращают одни и те же одиночные наборы:

GROUP BY GROUPING SETS ( (C1, C2, ..., Cn) )
GROUP BY C1, C2, ..., Cn

Операторы ROLLUP, эквивалентные оператору GROUPING SETS

Предложение GROUP BY ROLLUP (<составной список элементов>) с n измерениями во входном списке эквивалентно оператору GROUPING SETS со всеми префиксами его входного списка (n+1), заданными в качестве наборов группирования.

Следующие предложения эквивалентны.

GROUP BY ROLLUP (C1, C2, …, Cn-1, Cn)
GROUP BY GROUPING SETS ( (C1, C2, …, Cn-1, Cn)
    ,(C1, C2, ..., Cn-1)
    ...
    ,(C1, C2)
    ,(C1)
    ,() )

Операторы CUBE, эквивалентные оператору GROUPING SETS

Предложение GROUP BY CUBE (<составной список элементов>) с n измерениями во входном списке эквивалентно оператору GROUPING SETS, у которого в качестве наборов группирования заданы все сочетания измерений из входного списка CUBE (2n комбинаций).

Следующие предложения эквивалентны.

GROUP BY CUBE (C1, C2, C3, ..., Cn-2, Cn-1, Cn)
GROUP BY GROUPING SETS (
     (C1, C2, C3, ..., Cn-2, Cn-1, Cn) -- All dimensions are included.
    ,( , C2, C3, ..., Cn-2, Cn-1, Cn) -- n-1 dimensions are included.
    ,(C1, C3, ..., Cn-2, Cn-1, Cn)
    …
    ,(C1, C2, C3, ..., Cn-2, Cn-1,)
    ,(C3, ..., Cn-2, Cn-1, Cn) -- n-2 dimensions included
    ,(C1  ..., Cn-2, Cn-1, Cn)
    …
    ,(C1, C2) -- 2 dimensions are included.
    ,…
    ,(C1, Cn)
    ,…
    ,(Cn-1, Cn)
    ,…
    ,(C1) -- 1 dimension included
    ,(C2)
    ,…
    ,(Cn-1)
    ,(Cn)
    ,() ) -- Grand total, 0 dimension is included.

Следующие предложения эквивалентны.

GROUP BY CUBE (C1, C2, C3)
GROUP BY GROUPING SETS ( (C1, C2, C3)
    ,(C1, C2)
    ,(C1, C3)
    ,(C2, C3)
    ,(C1)
    ,(C2)
    ,(C3)
    ,() )

Составные столбцы в операторе ROLLUP, включая набор группирования внутри ROLLUP

Следующие предложения эквивалентны.

ROLLUP(A, (C1, C2, ..., Cn) )
ROLLUP( (A), (C1, C2, ..., Cn) )
GROUPING SETS ( (A, C1, C2, ..., Cn), (A), () )

Составные столбцы в операторе CUBE, включая набор группирования внутри CUBE

Следующие предложения эквивалентны.

CUBE(A, (C1, C2, ..., Cn) )
CUBE( (A), (C1, C2, ..., Cn) )
GROUPING SETS ( (), (A), (C1, C2, ..., Cn), (A, C1, C2, ..., Cn) )

Предложение GROUP BY с оператором GROUPING SETS, ROLLUP или CUBE

Следующие предложения эквивалентны.

GROUP BY A, CUBE (B, C)
GROUP BY GROUPING SETS ( (A), (A, B), (A, C), (A, B, C ))

Следующие предложения эквивалентны.

GROUP BY A, GROUPING SETS ( (B), (C) )
GROUP BY GROUPING SETS ( (A, B), (A, C) )

Следующие предложения эквивалентны.

GROUP BY ROLLUP (A, B), ROLLUP(C, D)
GROUP BY GROUPING SETS
    ( (),(C),(C,D),(A),(A,C),(A,C,D),(A,B),(A,B,C),(A,B,C,D) )

Оператор ROLLUP, включенный в список GROUPING SETS

Следующие предложения эквивалентны.

GROUP BY GROUPING SETS ( (A), ROLLUP (B, C) )
GROUP BY GROUPING SETS ( (A), (B,C), (B), () )

Оператор ROLLUP, включенный в набор группирования

Следующие предложения эквивалентны.

GROUP BY GROUPING SETS(A, (B, ROLLUP(C, D)) )
GROUP BY GROUPING SETS (A, B, (B,C), (B, C, D) () )