一尘不染

如何联接三个表以求和

sql

我有三个表:“产品”,“购买”,“发票”

产品表
Producct_no听名字
1引用
2听B
3引用C

采购表
purchase_no听产品_no数量
001引用1听81
002引用150
003引用3引用10

发票表
Invoice_no听产品_no数量
001引用1引用20
002引用10
003引用3引用10

我想获取每种产品的购买数量和发票数量,我使用以下查询

    选择PR.product_no,sum(P.qty),sum(I.qty)
    从产品公关 
    左加入发票I ON I.product_no = PR.product_no
    LEFT JOIN购买P ON P.product_no = PR.product_no
    按PR.product_no分组

product_no听sum(P.qty)sum(I.qty)
001引用162听160
002引用150引用50
003听10引用10

编辑:预期的结果
product_no听取sum(P.qty)sum(I.qty)
001引用81听20
002引用150引用10
003听10引用10

我的查询给我错误的答复(数量总和是错误的),请帮助我更正我的查询以正确获得结果。谢谢


阅读 128

收藏
2021-03-10

共1个答案

一尘不染

根据提供的信息,我认为您的样本数据并不是您真正拥有的。我最好的猜测是,您的查询正在对这两个连接中的一个或两个进行扇出操作,这会使您的总和混乱。您需要分别对它们进行求和,否则,那些联接中的任何一个联接上的其他行都会扇出另一个联接,从而使总和中的结果重复。这在您的结果中很明显,因为001看起来是两倍(即使您的示例数据没有显示它)。

这样的事情将确保总和彼此独立:

SELECT PR.product_no, 
    ( SELECT sum(I.qty)
      FROM invoice I 
      WHERE I.product_no=PR.product_no ) invoice_qty,
    ( SELECT sum(P.qty)
      FROM purchase P 
      WHERE P.product_no=PR.product_no ) purchase_qty
FROM products PR
2021-03-10