sql - 从 2 个表的总和计算的 SQL
问题描述
我有 2 个表Sales
,return
并且我有两个查询来获取每天的销售总额和某个月份的返回总额。结果是这样的。
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
是否可以使用单个查询?
解决方案
您应该使用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'
推荐阅读
- python - 将列类型从对象转换为日期格式 - python
- ruby-on-rails - Omniauth-Saml with Devise - 映射和使用属性
- javascript - 如何提高 PixiJS 画布的质量?
- python - 数据帧中系列的多级过滤和频率计数
- java - 为什么 Glassfish 5.1 容器不调用单例中注入的 CDI 拦截器
- swift - 如何修复错误:线程 1:致命错误:索引超出范围”?
- laravel - Laravel Jensseger Mongodb 属于ToMany 附加字段
- batch-file - 批处理中的 findstr 语法
- grafana - Grafana URL 警报
- php - 使用 move_uploaded_file() 时权限被拒绝的问题