[英]MySQL sum where inner join is missing from right or left table
我在一侧有一张周转台,上面有:
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 的 Turnover 和 120 的 Transactions 生成总和(2020-01-04 日期缺少 20,因为该日期在 Turnover 表中不可用,因此在连接中失败)。
缺少运行 2 个 select 总和查询,有没有办法运行这些总和?
非常感激。
您在两个表中都缺少日期,这排除了left join
解决方案。 从概念上讲,您希望full join
。 在 MySQL 中,不支持这种语法的地方,可以使用union all
; rest 只是聚合:
select sum(turnover) turnover, sum(transactions) transactions
from (
select mydate, turnover, 0 transactions
union all
select mydate, 0, transactions
) t
where mydate >= '2020-01-01'
关于这种统计,你不应该使用 JOIN。 因为您可能会因行重复而得到错误的结果。 特别是在实践中,我们需要连接很多表。
所以我建议使用 UNION,如下所示:请在 UNION 中包含日期 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,
myDate,
0 AS Turnover,
Transactions
WHERE myDate BETWEEN '2020-01-01'
AND '2020-08-21'
FROM
Transactions) AS t
GROUP BY Storeid ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.