按日期计算tblWithdraw总Price与tblProfit总Amount差值的SQL查询问题求助
解决SQL汇总计算错误的问题
我来帮你搞定这个查询问题!你的原SQL出现错误结果,核心原因是直接关联两张未汇总的表产生了笛卡尔积:tblWithdraw在2021-02-09有7条记录,tblProfit同日期有4条记录,连接后会生成7×4=28条重复数据,导致SUM计算时把取款金额重复加了4次、利润金额重复加了7次,最终得到的是错误的放大值。
正确的解决思路
先分别对两张表按日期独立汇总,再将汇总后的结果关联,这样就能彻底避免重复计算的问题。
修正后的SQL查询
SELECT -- 取存在的日期,避免某张表无对应日期时出现NULL COALESCE(w.Date, p.Date) AS Date, -- 处理无取款记录的日期,默认填充0 COALESCE(w.TotalWithdraw, 0) AS TotalWithdraw, -- 处理无利润记录的日期,默认填充0 COALESCE(p.TotalProfit, 0) AS TotalProfit, -- 计算扣除取款后的利润差值 (COALESCE(w.TotalWithdraw, 0) - COALESCE(p.TotalProfit, 0)) AS NetProfitAfterWithdraw FROM -- 先汇总tblWithdraw的每日取款总额 (SELECT Date, SUM(Price) AS TotalWithdraw FROM tblWithdraw GROUP BY Date) w -- 用全连接确保某一天只有取款或只有利润时也能正常显示 FULL JOIN -- 先汇总tblProfit的每日利润总额 (SELECT Date, SUM(Amount) AS TotalProfit FROM tblProfit GROUP BY Date) p ON w.Date = p.Date;
验证结果
根据你提供的数据计算:
- tblWithdraw的当日取款总和:2000+300+1500+4000+340+200+120 = 8460.00
- tblProfit的当日利润总和:9500+20580+24000+10800 = 64880.00
- 最终差值:8460.00 - 64880.00 = -56420.00
这个结果就是你需要的扣除取款额后的利润总金额。
内容的提问来源于stack exchange,提问作者sandanuwan dharmarathna
相关产品推荐
相关产品推荐

