MySQL 右侧或左侧缺少内部连接的总和 table
MySQL sum where inner join is missing from right or left table
我的一侧有失误 table :
Storeid Turnover myDate
| 1 | 1000 | 2020-01-01 |
| 1 | 200 | 2020-01-02 |
| 1 | 4000 | 2020-01-03 |
| 1 | 1000 | 2020-01-05 |
在另一边我有一个 table 交易数量:
Storeid Transactions myDate
| 1 | 20 | 2020-01-01 |
| 1 | 40 | 2020-01-03 |
| 1 | 20 | 2020-01-04 |
| 1 | 60 | 2020-01-05 |
我需要计算给定日期范围内的营业额总和和交易总和。但是,我可能缺少 table 中任何一个的日期。如果我分别对它们求和,我会得到每个正确答案,但任何类型的内部或左连接都会得到不完整的答案(如下所示):
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,因为该日期在营业额 table 中不可用,因此在加入)。
缺少运行ning 2 select求和查询,有没有办法运行这些求和?
非常感谢。
您在两个表中都缺少日期,这排除了 left join
解决方案。从概念上讲,您想要 full join
。在MySQL中,不支持这种语法的地方,可以使用union all
;剩下的只是聚合:
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 ;
我的一侧有失误 table :
Storeid Turnover myDate
| 1 | 1000 | 2020-01-01 |
| 1 | 200 | 2020-01-02 |
| 1 | 4000 | 2020-01-03 |
| 1 | 1000 | 2020-01-05 |
在另一边我有一个 table 交易数量:
Storeid Transactions myDate
| 1 | 20 | 2020-01-01 |
| 1 | 40 | 2020-01-03 |
| 1 | 20 | 2020-01-04 |
| 1 | 60 | 2020-01-05 |
我需要计算给定日期范围内的营业额总和和交易总和。但是,我可能缺少 table 中任何一个的日期。如果我分别对它们求和,我会得到每个正确答案,但任何类型的内部或左连接都会得到不完整的答案(如下所示):
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,因为该日期在营业额 table 中不可用,因此在加入)。
缺少运行ning 2 select求和查询,有没有办法运行这些求和?
非常感谢。
您在两个表中都缺少日期,这排除了 left join
解决方案。从概念上讲,您想要 full join
。在MySQL中,不支持这种语法的地方,可以使用union all
;剩下的只是聚合:
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 ;