右或左表中缺少内部联接的MySQL总和

问题描述

我的一侧有一张营业额表,

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 ;