2014-03-19 84 views
0

我有這3代表在這裏:當我加入了父表中的結果,它會影響一個項目,它應該不會受到影響

producttbl: 
    p_id  p_name   price 
    ANK001  ANKLET   200 
    BRC001  BRACELET   100 


    stocks_add: 
    p_id   qty 
    ANK001   200 
    ANK001   50 


    stocks_rel: 
    p_id   qty 
    ANK001   20 

,我有這個代碼就在這裏(這是由@建議波西米亞雖然我加入了一些):

Select p.p_id, p.p_name, p.price, 
`coalesce((SELECT sum(a.qty) 
    FROM stocks_add a GROUP BY a.p_id),0) 
-coalesce((SELECT sum(r.qty) 
    FROM stocks_rel r GROUP BY r.p_id),0) 
as stock_on_hand 
from productstbl p 
left join stocks_add a 
on a.p_id=p.p_id 
left join stocks_rel r 
on r.p_id=p.p_id 
GROUP BY p.p_id` 

,當我執行它,它會導致這樣:

p_id p_name price stock_on_hand 
ANK001 Anklet 200  230 
BRC001 Bracelet 75  230 

我嘗試從第二張和第三張桌子上拿到手中的股票。 並將其與產品錶鏈接。

假設是,230應該只與ANK001。期望的輸出應該是這一個:

`p_id p_name price stock_on_hand 
    ANK001 Anklet 200  230  
    BRC001 Bracelet 75   0 

` 

但第一個輸出的結果告訴其他方式。 ?:( 什麼是錯的代碼,請不要幫我

+0

如果你創建了一個可以重現你的問題的sqlfiddle,那將是最好的。我必須這樣做,基本上我回答每個SQL問題。此外,請在表的命名上保持一致 - 在讀取查詢時必須在STOCKS_RELEASED和stocks_rel之間進行轉換並不是非常有用! –

+0

我編輯了我所做的錯誤..當然。我會。我會盡力。 :) – jaegyo23

+0

感謝您的修復 - 爲我節省了幾分鐘建設小提琴(我不得不做幾個手動更改,但沒有什麼大不了的)。 SQLFiddle真的很不錯,我建議你在適當的時候嘗試一下 - 並且確保使用完全岩石化的「Text to DDL」按鈕! –

回答

0

我不知道你的查詢您的問題是什麼,但這裏的它是如何最簡單的我寫:

select p.*, IFNULL(aqty,0) - IFNULL(rqty,0) AS stock_on_hand 
from productstbl p 
left join (
    select p_id, SUM(IFNULL(a.qty,0)) as aqty 
    from stocks_add a 
    group by p_id 
) AS asum 
    on asum.p_id = p.p_id 
    left join 
    (
    select p_id, SUM(IFNULL(r.qty,0)) as rqty 
    from stocks_rel r 
    group by p_id 
) AS rsum 
    on rsum.p_id = p.p_id; 

它實際上給出正確的結果!這是一個很好的事情查詢做:)

P_ID P_NAME PRICE STOCK_ON_HAND 
ANK001 ANKLET 200 230 
BRC001 BRACELET 100 0 

http://sqlfiddle.com/#!2/3c778/3

+0

嗨@Dan Farell!是的,它確實給出了正確的結果。 :)我很難想出什麼可能會導致我的第一個輸出錯誤。無論如何,我想使用您評論的代碼,如果我可以。 :)當然是 – jaegyo23

+0

!這就是爲什麼我把它放在這裏。 –

相關問題