繁体   English   中英

MySQL 总和,其中右表或左表中缺少内部连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM