如何对查询出的本月Campaign日付款金额结果进行求和?
如何对现有SQL查询的日付款金额结果求和
嘿,这事儿其实很容易解决!你只需要把当前计算每条记录日付款金额的查询当作一个临时数据源,然后对里面的TotalAmountForMonth字段做求和操作就行。下面给你两种常用的实现方式:
方法一:使用子查询包裹原查询
把你现有的查询嵌套在一个子查询里,外层用SUM()函数对计算出的日金额求和:
SELECT SUM(TotalAmountForMonth) AS TotalDailyAmountSum FROM ( -- 你原来的查询语句 SELECT TotalAmount / DateDiff(dd, StartDate, DateAdd(dd, 1, EndDate)) AS TotalAmountForMonth FROM Campaign WHERE StartDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AND StartDate < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 1) ) AS DailyAmounts
方法二:使用CTE(公共表表达式)提升可读性
如果你觉得子查询嵌套看起来有点乱,可以用CTE先定义好日金额的数据集,再对其求和,代码可读性会更好:
WITH DailyAmounts AS ( -- 你原来的查询语句 SELECT TotalAmount / DateDiff(dd, StartDate, DateAdd(dd, 1, EndDate)) AS TotalAmountForMonth FROM Campaign WHERE StartDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AND StartDate < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 1) ) SELECT SUM(TotalAmountForMonth) AS TotalDailyAmountSum FROM DailyAmounts
额外提示:避免除以0的错误
如果存在StartDate和EndDate相同的情况,DateDiff(dd, StartDate, DateAdd(dd, 1, EndDate))会返回0,这时候会触发除以0的错误。你可以用NULLIF()函数处理这种情况,让除数为0时返回NULL(SUM()会自动忽略NULL值):
-- 修改后的计算逻辑 TotalAmount / NULLIF(DateDiff(dd, StartDate, DateAdd(dd, 1, EndDate)), 0) AS TotalAmountForMonth
用你提供的示例数据来计算的话,最终求和结果会是63.8709677419355 + 39.71875 + 62.96875 + 29.75 + 0 = 196.3084677419355,SQL会帮你算出精确的数值。
内容的提问来源于stack exchange,提问作者Ulaş Kasım
相关产品推荐
相关产品推荐

