Статьи

T-SQL ROLLUP и CUBE

Вступление

Прежде всего, я приветствую всех новых и награжденных MVP в апреле 2015 года. Я поздравляю их с достижением. Надеюсь, что сообщество может узнать много нового от них.

После моего сообщения в блоге «Группировка по групповому набору» от моего круга друзей поступили запросы на завершение статьи, предоставив что-то, связанное с CUBE, ROLLUP и COMPUTE. Итак, в этой статье мы пытаемся узнать что-то связанное с этим. Надеюсь, это будет информативным.

КУБ и РОЛЛУП

Обычно CUBE и ROLLUP используются для целей отчетности, и они составляют Итого и общий итог. CUBE  создает набор результатов, который показывает агрегаты для всех комбинаций значений в выбранных столбцах, а ROLLUP  создает набор результатов, который показывает агрегаты для иерархии значений в выбранных столбцах.

Давайте возьмем пример, чтобы понять это

У нас есть такой стол.

Учебный класс Раздел Рулон Метки
1 1 40
1 2 30
1 3 20
1 В 1 40
1 В 2 30
1 В 3 30
2 1 20
2 2 60
2 3 40
2 В 1 20
2 В 2 30
2 В 3 20

Если мы сделаем WITH ROLLUP, мы можем получить вывод, как это

Учебный класс Раздел Метки
1 90
1 В 100
1 НОЛЬ 190 90 + 100
2 120
2 В 70
2 НОЛЬ 190 120 + 70
НОЛЬ НОЛЬ 380 190 + 190

Если мы создадим WITH CUBE, то получим вот такой вывод

Учебный класс Раздел Метки
1 90
1 В 100
1 НОЛЬ 190 90 + 100
2 120
2 В 70
2 НОЛЬ 190 120 + 70
НОЛЬ НОЛЬ 380 190 + 190
НОЛЬ A 210 90 + 120
НОЛЬ В 170 100 + 70

Давайте возьмем практический пример

Шаг 1 [Создать базовую таблицу]

 IF OBJECT_ID(N'[dbo].[tbl_EXAMPLETABLE]', N'U')IS NOT NULL
  BEGIN
  DROP TABLE [dbo].[tbl_EXAMPLETABLE];
  END
GO
CREATE TABLE [dbo].[tbl_EXAMPLETABLE]
  (
    CLASS  INT  NOT NULL,
    SECTION  CHAR(1)  NOT NULL,
    ROLL  INT  NOT NULL,
    MARKS  INT  NOT NULL
  );   

Шаг 2 [Вставить записи в базовую таблицу]

 INSERT INTO [dbo].[tbl_EXAMPLETABLE]
  (CLASS, SECTION, ROLL, MARKS)
VALUES(1,  'A', 1, 40),
  (1,  'A',  2, 30),
  (1,  'A',  3, 20),
  (1,  'B',  1, 40),
  (1,  'B',  2, 30),
  (1,  'B',  3, 30),
  (2,  'A',  1, 20),
  (2,  'A',  2, 60),
  (2,  'A',  3, 40),
  (2,  'B',  1, 20),
  (2,  'B',  2, 30),
  (2,  'B',  3, 20);

Шаг — 4 [Сделать С РОЛЛУПОМ]

 SELECT  CLASS, SECTION, SUM(MARKS) AS MARKS
FROM  [dbo].[tbl_EXAMPLETABLE]
GROUP BY CLASS, SECTION WITH ROLLUP;

Вывод

Шаг 5 [Сделать С КУБОМ]

 SELECT  CLASS, SECTION, SUM(MARKS) AS MARKS
FROM  [dbo].[tbl_EXAMPLETABLE]
GROUP BY CLASS, SECTION WITH CUBE;

Вывод

Надеюсь, вам понравится.