使用分组集获取总计

Getting grand totals with grouping sets

我正在将 SQL SERVER 2005 迁移到 SQL SERVER 2014 并遇到了这个问题。我有一个 "search engine" STORED PROCEDURE 可以为我的报告网站即时构建报告查询。在旧版本中,我使用 COMPUTE BY 来获取小计和总计。 COMPUTE BY 在 SQL SERVER 2014 中不再受支持,我转而使用 GROUPING SETS。但是,有一个问题。报告可以有多页。他们可以有 200 页以上。我只想在最后一页显示总计。默认情况下,ever page 获取 1000 条记录。最后一页通常会显示剩余记录和整个记录集的总计。我可以用 COMPUTE BY 来实现。使用 GROUPING SETS,我不能。我只能计算最后一页的总计,而不是整个记录集。任何建议,将不胜感激。谢谢。

您应该可以使用 WITH ROLLUPOFFSET/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 计算整个数据集,而不仅仅是页面。