获得具有分组集的总计

时间:2016-02-16 16:45:51

标签: sql sql-server tsql sql-server-2014 grouping-sets

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

1 个答案:

答案 0 :(得分:2)

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