代码之家  ›  专栏  ›  技术社区  ›  Rafi Ahmad

来自具有联接的单个表的SQL求和

sql
  •  0
  • Rafi Ahmad  · 技术社区  · 7 年前

    我有两个订单和订单项。 订单表具有id、订单总数、已收金额 orderitems表具有id、订单id、名称、项目总数

    SELECT SUM(`received_amount`) as totalRecieved,
           SUM(`order_total`) as orderTotal
    FROM   `orders` AS `Order`
    LEFT JOIN `order_items` AS `OrderItems`
           ON (`OrderItems`.`order_id`=`Order`.`id`)
    

    和

    SELECT SUM(`received_amount`) as totalRecieved,
           SUM(`order_total`) as orderTotal
    FROM   `orders` AS `Order`
    LEFT JOIN `order_items` AS `OrderItems`
           ON (`OrderItems`.`order_id`=`Order`.`id`)
    group by order.id
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    您在数据层次结构的两个级别上进行聚合。这会导致每个订单的笛卡尔乘积出现问题。

    order_items 之前 做 join :

    SELECT SUM(received_amount) as totalRecieved, 
           SUM(order_total) as orderTotal
    FROM orders o LEFT JOIN
         (SELECT oi.order_id, SUM(total_items) as total_items
          FROM order_items oi
          GROUP BY oi.order_id
         ) oi
         ON oi.order_id = o.id;
    
        2
  •  0
  •   Eray Balkanli    7 年前

    作为替代方案,您可以从cte结构或类似以下的临时表中获益:

    ;with cte (order_id, SumTotalItems) as (
      SELECT oi.order_id, SUM(total_items) as SumTotalItems
      FROM order_items oi
      GROUP BY oi.order_id
    )
    select sum(o.receivedamount) as SumReceivedAmount
         , sum(o.order_total) as SumOrderTotal
         , cte.SumTotalItems
    from orders o
    left outer join cte on o.id = cte.order_id