2012-07-05 99 views
4

我有3個表的股票,向內,問題SQL Server 2005的錯誤輸出

庫存表中的列和數據:

part_no | part_name | totalqty 
10100  ciol  30 
112233  abc  20 
123456  coper  50 

向內表:

part_no | qty 
123456 10 
123456 20 
10100 20 
112233 15 
10100 25 

問題表:

part_no | qty 
112233 20 
112233 15 
123456 10 
112233 25 
10100 40 
10100 20 

我想要的輸出:

part_no | part_name |inwardQty |issueQty 
10100  coil   45  60 
112233  abc   15  60 
123456  coper  30  10 

下面是我寫的查詢,但沒有給我想要的輸出

select s.part_no,s.part_name,sum(i.qty) as inwardQty,sum(p.qty)as issueQty 
from stock s 
left join inward i on s.part_no = i.part_no 
left join issue p on s.part_no = p.part_no 
group by 
    s.part_no,s.part_name 

得到以下這個查詢輸出:

part_no | part_name |inwardQty |issueQty 
10100  coil   90  120 
112233  abc   45  60 
123456  coper  30  20 
+0

歡迎使用StackOverflow:如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)格式和語法突出顯示它! –

+0

@marc_s - I * think *這是句子「我的理想輸出:」 –

+0

@Damien_The_Unbeliever下面的代碼片段:是的是 - 早上太早,我的系統中還沒有足夠的咖啡:-) –

回答

4

的問題是,你匹配行爲inward行爲issue,爲此他們正在處理相同的部分。我覺得子查詢將是最好的位置:

select s.part_no,s.part_name,i.qty as inwardQty,p.qty as issueQty 
from stock s 
left join 
    (select part_no,sum(qty) as qty from inward group by part_no) i on s.part_no = i.part_no 
left join 
    (select part_no,sum(qty) as qty from issue group by part_no) p on s.part_no = p.part_no 

所以,現在,只有一個(或零)排在每個連接來連接,而你沒有得到一個笛卡爾乘積。

+0

謝謝先生,現在它工作完美。我想問你,先生,在這個查詢中,如果我希望數據應顯示特定月份(eg.month(i.date)= 6),那麼我應該在哪裏寫月份條件在上面查詢,如果我在內部表中添加數據列。謝謝 – user1482953

1

嘗試此查詢:

SELECT 
    s.part_no, s.part_name, 
    InwardQty = (SELECT SUM(qty) FROM @inward i WHERE i.part_no = s.part_no), 
    IssueQty = (SELECT SUM(qty) FROM @issue p WHERE p.part_no = s.part_no) 
FROM 
    dbo.stock s 
GROUP BY 
    s.part_no, s.part_name 

給我確切所需輸出。