Получение общих итогов с помощью групповых наборов

Я мигрирую 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 вычисляет весь набор данных, а не только страницу.

Другие вопросы по тегам