【问题标题】:Getting grand totals with grouping sets使用分组集获取总计
【发布时间】:2016-05-28 01:37:48
【问题描述】:

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

【问题讨论】:

  • 你能添加一个示例表/示例查询/期望的结果吗?如果不能看到实际存在的问题,就很难提供帮助。

标签: sql sql-server tsql sql-server-2014 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 计算整个数据集,而不仅仅是页面。

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2012-09-15
    • 2019-01-04
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多