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 ;