【问题标题】:MYSQL Sum distinct values after left join左连接后的MYSQL求和不同的值
【发布时间】:2017-07-12 14:47:14
【问题描述】:

我有这些表

/*OrderRows*/

order_id | row_id | article | quantity
    1    |    1   |   pen   |   10
    1    |    2   |scissors |   7
    2    |    3   |  book   |   5 
    3    |    4   |  pen    |   5 

/*Shipments*/

shipment_id | row_id   | quantity_shipped
    1       |     1    |         3
    2       |     1    |         4
    3       |     1    |         3
    4       |     2    |         7
    5       |     3    |         5
    6       |     4    |         5

我需要生成一份报告来检查订单是否已全部发货

我希望使用左连接而不是子查询(只是为了检查:它是否更有效?)

如果我问

SELECT
    OrderRows.order_id,
    sum(OrderRows.quantity) as ordered,
    sum(Shipments.quantity_shipped) as shipped
FROM
    Orders
LEFT JOIN Shipments ON OrderRows.row_id = Shipments.row_id
GROUP BY OrderRows.order_id

我显然得到了

order_id | orderered | shipped
    1    |    27    |   17
    2    |    5     |   5
    3    |    5     |   5

那是因为让 left join 将 Orders.quantity 复制了三遍 for order_id = 1(因为 order_id = 1 有 3 批货)

如何在不使用子查询的情况下获得它?

order_id | orderered | shipped
    1    |    17    |   17
    2    |    5     |   5
    3    |    5     |   5

【问题讨论】:

    标签: mysql select sum left-join


    【解决方案1】:

    如果有序/数量是order_id 的属性,那么只需选择它并选择group by

    SELECT
        Orders.order_id,
        Orders.quantity as ordered,
        sum(Shipments.quantity_shipped) as shipped
    FROM
        Orders
    LEFT JOIN Shipments ON Orders.order_id = Shipments.order_id
    GROUP BY Orders.order_id,orders.quantity
    

    【讨论】:

    • 哈!你在我做这个的时候回答了:sqlfiddle.com/#!6/5ce8e/3
    • 你的回答是对的,但是我的代码简化了太多,这些是订单行,而不仅仅是订单,所以如果我按 orders.quantity 分组,我会在结果集中获得一个重复的行。我更新了我的问题以显示这一点。对不起男人
    • 那么你的数据模型是错误的,因为你有多个相同的订单行!如果您想坚持知道所有行的数量相同,只需选择 MAX 而不是总和。
    • 所有行的数量都不相同,它与该订单上特定商品的数量相关,事实上对于 order_id = 1 有两行数量 = 10 它只是一个案子。我正在编辑它,以免造成混乱
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多