【问题标题】:MySQL sum where inner join is missing from right or left table右表或左表中缺少内部连接的 MySQL 总和
【发布时间】:2020-12-10 08:08:30
【问题描述】:

我在一侧有一张周转台,上面有:

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'

这将为 Turnover 6200 和 Transactions 120 生成总和(2020-01-04 日期缺少 20,因为该日期在 Turnover 表中不可用,因此在联接中失败)。

缺少运行 2 个选择总和查询,有没有办法运行这些总和?

非常感谢。

【问题讨论】:

    标签: mysql sql sum inner-join full-outer-join


    【解决方案1】:

    关于这种统计信息,您不应该使用 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 ;
    

    【讨论】:

      【解决方案2】:

      您在两个表中都缺少日期,这排除了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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-14
        • 2011-04-29
        • 1970-01-01
        • 2016-08-31
        • 2015-10-28
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多