问题描述
我的一侧有一张营业额表,
Storeid Turnover myDate
| 1 | 1000 | 2020-01-01 |
| 1 | 200 | 2020-01-02 |
| 1 | 4000 | 2020-01-03 |
| 1 | 1000 | 2020-01-05 |
Storeid Transactions myDate
| 1 | 20 | 2020-01-01 |
| 1 | 40 | 2020-01-03 |
| 1 | 20 | 2020-01-04 |
| 1 | 60 | 2020-01-05 |
我需要计算给定日期范围内的营业额和交易总额。但是,我可能在任一表上都缺少日期。如果我分别对它们进行求和,那么我会为每个内连接或左连接获得正确的答案,而我会得到不完整的答案(如下所示):
select sum(Turnover),sum(transactions) from TurnoverTable
left join TransactionTable on TurnoverTable.storeid = TransactionTable.storeid and
TurnoverTable.myDate = TransactionTable.myDate where TurnoverTable.myDate >= '2020-01-01'
这将产生6200的总交易额和120的交易总和(2020-01-04日期缺少20个,因为该日期在“交易额”表中不可用,因此无法加入)。
运行2个选择总和查询的时间短,有没有办法运行这些总和?
非常感谢。
解决方法
两个表中都缺少日期,因此排除了taskkill
解决方案。从概念上讲,您想left join
。在不支持此语法的MySQL中,可以使用full join
;其余只是聚合:
union all
,
关于这种统计,您不应该使用JOIN。因为行重复可能会导致错误的结果。特别地,我们需要在实践中加入许多表。
因此,我建议像下面这样使用UNION:请在UNION中加入date where子句。
SELECT
Storeid,SUM(Turnover),SUM(Transactions)
FROM
(SELECT
Storeid,myDate,Turnover,0 AS Transactions
FROM
turnovers
WHERE myDate BETWEEN '2020-01-01'
AND '2020-08-21'
UNION
ALL
SELECT
Storeid,0 AS Turnover,Transactions
WHERE myDate BETWEEN '2020-01-01'
AND '2020-08-21'
FROM
Transactions) AS t
GROUP BY Storeid ;