Получение общих итогов с помощью групповых наборов
Я мигрирую SQL SERVER 2005 в SQL SERVER 2014 и столкнулся с этой проблемой. У меня есть "поисковая система" STORED PROCEDURE
который на лету создает отчётные запросы для моего отчётного сайта. В старой версии я использовал COMPUTE BY
чтобы получить промежуточные и общие итоги. COMPUTE BY
больше не поддерживается в SQL SERVER 2014, и я перешел на использование GROUPING SETS
, Тем не менее, есть проблема. Отчеты могут иметь более одной страницы. Они могут иметь до 200 страниц. Я только хочу показать общий итог на последней странице. По умолчанию когда-либо страница получает 1000 записей. На последней странице обычно отображаются оставшиеся записи и общая сумма по всему набору записей. Я мог бы достичь этого с COMPUTE BY
, С GROUPING SETS
, Я не могу. Я могу рассчитать только общий итог по последней странице, а не по всему набору записей. Мы ценим любые предложения. Благодарю.
1 ответ
Вы должны быть в состоянии просто использовать WITH ROLLUP
и страница с OFFSET
/FETCH
;
CREATE TABLE test (id INT, val INT);
INSERT INTO test VALUES (1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(2,5);
INSERT INTO test VALUES (3,1),(3,2),(3,3),(3,4),(4,1),(4,2),(4,3),(4,4),(4,5);
Общий результат;
SELECT id, SUM(val) val FROM test GROUP BY id WITH ROLLUP
ORDER BY CASE WHEN id IS NULL THEN 1 END, id
id val
1 10
2 15
3 10
4 15
null 50 -- Total sum rollup
... и последняя страница размером 3 страницы;
SELECT id, SUM(val) val FROM test GROUP BY id WITH ROLLUP
ORDER BY CASE WHEN id IS NULL THEN 1 END, id
OFFSET 3 ROWS -- skip 3 rows
FETCH NEXT 5 ROWS ONLY; -- take 3 rows
id val
4 15
null 50 -- Total sum rollup
Как вы видите, WITH ROLLUP
+ OFFSET
/FETCH
вычисляет весь набор данных, а не только страницу.