Мы можем понять разницу между ROLLUP и CUBE на простом примере.Предположим, у нас есть таблица, в которой содержатся результаты ежеквартального тестирования студентов.В некоторых случаях мы должны видеть общее количество, соответствующее кварталу, а также студентов.Вот пример таблицы
SELECT * INTO #TEMP
FROM
(
SELECT 'Quarter 1' PERIOD,'Amar' NAME ,97 MARKS
UNION ALL
SELECT 'Quarter 1','Ram',88
UNION ALL
SELECT 'Quarter 1','Simi',76
UNION ALL
SELECT 'Quarter 2','Amar',94
UNION ALL
SELECT 'Quarter 2','Ram',82
UNION ALL
SELECT 'Quarter 2','Simi',71
UNION ALL
SELECT 'Quarter 3' ,'Amar',95
UNION ALL
SELECT 'Quarter 3','Ram',83
UNION ALL
SELECT 'Quarter 3','Simi',77
UNION ALL
SELECT 'Quarter 4' ,'Amar',91
UNION ALL
SELECT 'Quarter 4','Ram',84
UNION ALL
SELECT 'Quarter 4','Simi',79
)TAB
![enter image description here](https://i.stack.imgur.com/qbzvk.jpg)
1.ROLLUP (можно найти общее количество для соответствующего одного столбца)
(a) Получить общий балл каждого студента за все кварталы.
SELECT * FROM #TEMP
UNION ALL
SELECT PERIOD,NAME,SUM(MARKS) TOTAL
FROM #TEMP
GROUP BY NAME,PERIOD
WITH ROLLUP
HAVING PERIOD IS NULL AND NAME IS NOT NULL
// Having is used inorder to emit a row that is the total of all totals of each student
Ниже приводится результат (a)
![enter image description here](https://i.stack.imgur.com/4C9p8.jpg)
(b) Если вам необходимо получить общий балл за каждый квартал
SELECT * FROM #TEMP
UNION ALL
SELECT PERIOD,NAME,SUM(MARKS) TOTAL
FROM #TEMP
GROUP BY PERIOD,NAME
WITH ROLLUP
HAVING PERIOD IS NOT NULL AND NAME IS NULL
Ниже приведен результат (b)
![enter image description here](https://i.stack.imgur.com/L1lyn.jpg)
2.CUBE (Найти сумму за четверть, а также студентов за один выстрел)
SELECT PERIOD,NAME,SUM(MARKS) TOTAL
FROM #TEMP
GROUP BY NAME,PERIOD
WITH CUBE
HAVING PERIOD IS NOT NULL OR NAME IS NOT NULL
Ниже приводится результат CUBE
![enter image description here](https://i.stack.imgur.com/h3Xfm.jpg)
Теперь вы можете задаться вопросом об использовании ROLLUP и CUBE в реальном времени.Иногда нам нужен отчет, в котором нам нужно увидеть итоговую оценку каждого квартала и итоговую оценку каждого студента за один раз.Вот пример
Я слегка изменяю вышеупомянутый запрос CUBE, так как нам нужно общее значение для обоих итогов.
SELECT CASE WHEN PERIOD IS NULL THEN 'TOTAL' ELSE PERIOD END PERIOD,
CASE WHEN NAME IS NULL THEN 'TOTAL' ELSE NAME END NAME,
SUM(MARKS) MARKS
INTO #TEMP2
FROM #TEMP
GROUP BY NAME,PERIOD
WITH CUBE
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + PERIOD + ']',
'[' + PERIOD + ']')
FROM (SELECT DISTINCT PERIOD FROM #TEMP2) PV
ORDER BY PERIOD
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM
(
SELECT * FROM #TEMP2
) x
PIVOT
(
SUM(MARKS)
FOR [PERIOD] IN (' + @cols + ')
) p;'
EXEC SP_EXECUTESQL @query
Теперь вы получите следующий результат
![enter image description here](https://i.stack.imgur.com/cxeOt.jpg)