SQL Server统计指定日期账单金额 仅展示总和大于0的分组如何实现
SQL查询问题解答
原有写法正确性说明
你编写的查询逻辑上可以计算出指定日期各MobileNr对应的账单总金额,但存在两处可优化的点:
- 日期赋值使用的
'01.05.2021'是区域相关格式,部分SQL Server实例会按MM.DD.YYYY解析为2021年1月5日,不符合你的查询需求 - 日期判断放在CASE表达式中会扫描所有MobileNr非空的记录,执行效率偏低
调整方案
要实现仅展示总金额Summ大于0的记录,仅需要在GROUP BY子句后添加HAVING条件过滤聚合结果即可,同时我们可以对原有查询做优化,调整后的完整语句如下:
DECLARE @specified_date DATE; -- 使用SQL Server无歧义的YYYYMMDD格式,避免区域设置导致的日期解析错误 SET @specified_date = '20210501'; SELECT CustomerNr, MobileNr, ROUND(SUM(Price), 2) AS Summ FROM BillingTable WHERE MobileNr <> '' -- 提前过滤目标日期数据,减少无效计算,提升查询效率 AND Bil_Start_Date = @specified_date GROUP BY CustomerNr, MobileNr -- 过滤总金额大于0的分组 HAVING ROUND(SUM(Price), 2) > 0
如果你需要保留原有CASE写法(比如后续要扩展同时统计多日期的金额列),仅需要在原有查询的GROUP BY后添加如下HAVING条件即可:
HAVING ROUND(SUM(CASE WHEN Bil_Start_Date = @specified_date THEN Price ELSE 0 END), 2) > 0
内容的提问来源于stack exchange,提问作者dejanm
相关产品推荐
相关产品推荐

