Вступление
Прежде всего, я приветствую всех новых и награжденных 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;
Вывод
Надеюсь, вам понравится.