SUM和GROUP BY问题

费诺尔

我有一个表交付和一个表订单。几个订单可以链接到一个交货。前几天我问了一个问题,有关如何获取的订单金额之和为特定的交付和很快就展示了如何。(再次感谢。)

现在,我们还添加了一个结算表,就像订单一样,可以有多个结算链接到一个交货(通过交货ID,就像与订单一样),而我也试图获得其值的总和。我以为我会使用相同的策略,并且也将LEFT JOIN放在结算表中,但是问题是,当只有一个结算链接到特定的交货时,SUM(s.amount)会返回实际值的两倍。

我尝试与GROUP BY一起玩都没有用。谁能告诉我我做错了什么?

提前致谢!

PS:这是我使用的查询,当只有一个结算时,它会返回结算金额的双倍值:

SELECT 
    d.id, 
    SUM(o.goods_amount) AS amount, 
    SUM(s.amount) AS settlementAmount, 
FROM delivery d 
LEFT JOIN order o 
    ON d.id = o.delivery_id 
LEFT JOIN settlement s 
    ON d.id = s.delivery_id 
WHERE d.id = *deliveryId*
GROUP BY d.id;
浅褐色的

正如Spencer所说,您正在获得某种交叉联接的结果。让我们看一下这个样本数据。

Delivery Table
ID  Delivered_On
1   2016-07-01
2   2016-07-02

Orders Table
id  Deliveries_id  Amount
1   1              100
2   1              200
3   1              300
4   2              75

Now your Settlements table
Settlements Table
id  Delivery_id   Amount
1   1             525   (explicitly wrong amount to show result)
2   1             75 

您的查询按每个交货ID求和,但是(左)同时连接到订单表和结算表。因此,由于每个表中存在的许多记录将被交叉联接,因此对于Delivery ID = 1,您有3个订单,但有1个结算。因此,结算记录也将加入到每个订单表中,而不仅是交货表,因此得到的结果为3 * 525或$ 1575加3 * 75 = $ 225,总计为$ 1800。您的订单总额将正确地为600美元。

要解决此问题,您可能需要预汇总每个辅助表,以便每个传送仅返回1个摘要记录并加入THOSE结果。为了防止查询所有订单和结算,我将加入交货表以限定所有订单中相同的日期范围。

SELECT 
      d.id AS delivery_id, 
      sumOrd.Amount as OrderAmount,
      sumStl.Amount as SettlementAmount
   from
      delivery d

         LEFT JOIN
         ( select 
                 d2.id,
                 SUM(o.amount) AS OrderAmount
              from
                 delivery d2
                    JOIN order o
                       ON d2.id = o.deliveries_id
              WHERE 
                     d2.delivered_on >= '2016-06-10' 
                 and d2.delivered_on < '2016-06-11'
              GROUP BY 
                 d2.id ) sumOrd
            on d.id = sumOrd.id

         LEFT JOIN
         ( select 
                 d2.id,
                 SUM(s.amount) AS SettlementAmount
              from
                 delivery d2
                    JOIN Settlement s
                       ON d2.id = s.delivery_id
              WHERE 
                     d2.delivered_on >= '2016-06-10' 
                 and d2.delivered_on < '2016-06-11'
              GROUP BY 
                 d2.id ) sumStl
            on d.id = sumStl.id
   where
          d.delivered_on >= '2016-06-10' 
      and d.delivered_on < '2016-06-11'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档