如何连接三个表来获得Sum

时间:2015-04-26 14:47:50

标签: mysql sql

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

产品表
Producct_no名称
1 A
2 B
3 C

购买表
Purchase_no Product_no数量
001 1 81
002 2 150
003 3 10

发票表
Invoice_no Product_no数量
001 1 20
002 2 10
003 3 10

我想获得每个产品的采购数量和发票数量,我使用了以下查询

    SELECT PR.product_no, sum(P.qty),sum(I.qty)
    FROM products PR 
    LEFT  JOIN invoice I ON I.product_no=PR.product_no
    LEFT  JOIN purchase P ON P.product_no=PR.product_no
    group by 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

我的查询给了我错误的回复(数量总和错误),请帮我纠正我的查询以正确获得结果。感谢

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

我认为你在GROUP BY遇到问题。在这种情况下我会做这样的事情

SELECT P.Product_no, Inv.InvProdSum, Pur.PurProdSum
FROM Product P
LEFT JOIN (SELECT Product_no, SUM(Qty) AS InvProdSum
          FROM Invoice 
          GROUP BY Product_no) AS Inv
ON P.Product_no = Inv.Product_no
LEFT  JOIN (SELECT Product_no, SUM(Qty) AS PurProdSum
            FROM Purchase 
            GROUP BY Product_no) AS Pur
ON P.Product_no = Pur.Product_no

以下是http://sqlfiddle.com/#!9/731a5/1

的SQL FIddle

注意我在这里添加一些额外的值来测试它是如何工作的......

GL!

答案 2 :(得分:0)

这是我没有子查询的解决方案:

with 
  product(product_no, name) as (values
  (1, 'A'),
  (2, 'B'),
  (3, 'C')
),
  purchase(purchase_no, product_no, qty) as (values
  ('001', 1, 81),
  ('002', 2, 150),
  ('003', 3, 10),
  ('004', 1, 1000)
),
  invoice(invoice_no, product_no, qty) as (values
  ('001', 1, 20),
  ('002', 2, 10),
  ('003', 3, 10),
  ('004', 2, 5000)
),
  mixed as
(select d.product_no,
  purchase_no, p.qty as qty_purchase, 
  invoice_no, i.qty as qty_invoice,
  row_number() over(partition by purchase_no) as rn_purchase,
  row_number() over(partition by invoice_no) as rn_invoice
from product d
left join purchase p on p.product_no = d.product_no 
left join invoice i on i.product_no = d.product_no
)
select product_no,
  sum((case when rn_purchase = 1 then 1 else 0 end) * qty_purchase) as sum_purchase,
  sum((case when rn_invoice = 1 then 1 else 0 end) * qty_invoice) as sum_invoice
from mixed 
group by product_no
order by product_no
;

结果:

product_no|sum_purchase|sum_invoice|
----------|------------|-----------|
         1|        1081|         20|
         2|         150|       5010|
         3|          10|         10|