【问题标题】:sql sub and grand totalsql sub和总计
【发布时间】:2011-07-01 14:00:02
【问题描述】:

这里有没有一种很好的简洁方法来获取总计 - 此查询显示每天的小计,但是如何在没有子查询或其他查询的情况下获得每个小计的总计

还有什么比计算总和更好用的吗?

SELECT loguser,logdate,logaction,logtime
FROM log WHERE loguser IN
('scott')   AND logdate  
BETWEEN '2011-06-01' AND '2011-06-15'   
ORDER BY logdate DESC    
COMPUTE SUM(logtime) BY logdate

SQL Server 2008 R2

【问题讨论】:

  • SQL有什么实现? SQL Server、Oracle、MySQL、PostgreSQL?
  • Google for 'sql compute' 似乎在 MS SQL Server 中提供了 COMPUTE 以实现向后兼容性,并且有首选替代方案。
  • 是的,我看到了——这就是为什么我问是否有更好的东西,谢谢!

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

我对 COMPUTE 并不熟悉,因为您使用过它,但它(或它的变体)应该适用于大多数 SQL 方言...

SELECT loguser,logdate,logaction,SUM(logtime)
FROM log WHERE loguser IN
('scott')   AND logdate  
BETWEEN '2011-06-01' AND '2011-06-15'
GROUP BY loguser,logdate,logaction WITH ROLLUP
ORDER BY logdate DESC    

【讨论】:

  • 看起来不错...知道为什么底部有 2 个总计,一个是 loguser,一个是 NULL
  • 有没有办法用文本代替空结果——比如“Sub Total:”、“Grand Total:”?
  • ROLLUP 正如它所说的,将按字段从右到左汇总所有分组。创造不断增加的求和水平。如果你ORDER BY loguser,logdate,logaction,你会看得更清楚。 (作为一个额外的参考,WITH CUBE 将找到所有可能的求和组合,因此 GROUP BY 中的顺序变为静音。)
  • 对于用文本替换 NULL,您有两种选择。 ISNULL() 将像往常一样替换它们。但有时您可能已经在字段中包含 NULL,并且无法确定哪个 NULL 是“真正的”NULL 以及哪个是 ROLLUP 的结果。或者这样的 cse,您可以使用 GROUPING(<field_name>) 返回该字段是否已被汇总,或者只是 GROUP BY 的正常部分。然后可以在 CASE 语句中使用它...CASE WHEN GROUPING(loguser) THEN 'GRAND TOTAL:' ELSE loguser END
【解决方案2】:

获得总计的更好方法是使用前端......而不是查询。

【讨论】:

  • 为什么,我会说这是一种“不同”的方式
【解决方案3】:

我认为您应该按照 Dems 的建议考虑使用 ROLLUP 而不是 COMPUTE,但如果您想要返回 3 个东西 - 1) 每日日志时间数据,2) 每日小计;并且,3) 总计(小计总计),那么我认为您需要 UNION 一个查询,该查询可以找到前两个,就像您使用查询总计的查询一样。

【讨论】:

  • 绝对想避免联合——我虽然也许你可以堆叠 COMPUTE SUM 来做到这一点——是的,它确实提供了多个结果集——但我能够做的一件事是格式化每个结果
  • @scott K - 我认为你不能堆叠 COMPUTE。这就是为什么如果你想要 3 个部分,我建议使用 UNION。我可能是错的。我认为 UNION 不会对性能造成那么大的影响。希望你能解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多