首页 > 解决方案 > 从 2 个表的总和计算的 SQL

问题描述

我有 2 个表Salesreturn并且我有两个查询来获取每天的销售总额和某个月份的返回总额。结果是这样的。

SELECT strftime('%m/%d', Date) as valDay, SUM(TotalPrice) as valTotal FROM Sales WHERE strftime('%m', Date) ='12' GROUP BY valDay;

结果

valDay  valTotal
12/01   50.0
12/02   50.0
12/04   50.0
12/05   120.0
12/06   160.0
12/07   30.0
12/08   80.0
12/09   50.0

第二个查询是

SELECT strftime('%m/%d', Date) as valDay, SUM(TotalPrice) as valTotal FROM return WHERE strftime('%m', Date) ='12' GROUP BY valDay;

结果

valDay  valTotal
12/01   10.0
12/05   100.0
12/08   20.0

我想从当天的销售额中扣除每天的退货总额。结果应该是这样的,忽略括号 btw

valDay  valTotal
12/01   40.0 (50-10)
12/02   50.0
12/04   50.0
12/05   20.0 (120 - 100)
12/06   160.0
12/07   30.0
12/08   60.0 (80 - 20) 
12/09   50.0

是否可以使用单个查询?

标签: sqlsqlite

解决方案


您应该使用UNION ALL来获取包含您想要的 2 个表的所有行的结果集,然后只聚合一次:

SELECT strftime('%m/%d', Date) valDay, SUM(TotalPrice) valTotal
FROM (
  SELECT Date, TotalPrice 
  FROM Sales 
  WHERE strftime('%m', Date) ='12'
  UNION ALL
  SELECT Date, -TotalPrice  -- here you get the negative TotalPrice of the column
  FROM return
  WHERE strftime('%m', Date) ='12'
)
GROUP BY valDay

如果您的数据扩展到超过 1 年,并且您想要的只是所有年份的所有 12 月的结果,那么此查询将起作用。

但是,如果您想要特定年份的结果,那么您还应该在WHERE子句中包含年份,例如:

WHERE strftime('%Y/%m', Date) = '2020/12'

推荐阅读