2013-07-29 147 views
1

我有一個使用SQL Server 2005 Express的程序,我需要一些幫助循環兩個表來計算庫存。對於SQL Server 2005 Express中的循環?

  • Table 1:在設置
  • Table 2存儲與庫存總的所有產品:從表中存儲針對所有產品的交易1

我怎樣才能通過全項循環表2和減去表1的數量有多少?

如果我有這樣的查詢,然後我得到的數據爲每個產品

SELECT 
    ii.ItemNum, ii.ItemName, ii.OzOnHand 
FROM 
    dbo.InventoryItems ii 
INNER JOIN 
    dbo.InventoryLog il ON ii.ItemNum = il.InvItemNum 
WHERE 
    ii.active = 1 

我需要從表2每次出現,從表1的總金額中扣除

+1

當你有一個查詢來解決,你認爲「我會用循環」 - 退一步,再想一想。 SQL被優化來處理集合,而不是一次循環一行。 –

回答

4

這是一個例子加入到聚合表(我認爲這是瞭解它的最佳方式):

SELECT ii.ItemNum, ii.ItemName, ii.OzOnHand, ii.OzOnHand - coalesce(il.cnt, 0) 
FROM dbo.InventoryItems ii LEFT JOIN 
    (select il.InvItemNum, sum(OzRemoved) as cnt 
     from dbo.InventoryLog il 
     group by il.InvItemNum 
    ) il 
    ON ii.ItemNum = il.InvItemNum 
WHERE ii.active = 1; 

子查詢組的一切日誌和統計條目數。如果每個條目都可能影響多個項目,那麼您可以使用類似sum(cnt) as cnt而不是count(*)

然後,查詢使用left outer join。這種連接類型可確保所有庫存項目保持不變,即使那些沒有任何記錄的項目也是如此。最後,計數從設置中可用的值減去。 coalesce()用於處理日誌表中沒有匹配的情況。爲了避免NULLNULL變成0

+0

這非常接近。我不需要減去InventoryLog表中匹配項目的「數量」,而是需要表格「OzRemoved」列中的數字。因此,您建議的查詢從「OzOnHand」中刪除了9,而不是從同一個表中的「OzRemoved」中刪除了9, – Matt

+2

@Matt公平,您的問題甚至沒有提及名爲「OzRemoved」的列,不介意提示是你之後的「數」。無論如何,我懷疑你可以從這裏拿戈登的答案,只需將'COUNT(*)'改爲'SUM(OzRemoved)'。 –

+0

我很抱歉@aaron,我剛剛意識到我沒有問題中的那個領域。我改變了之前,你的意見,我認爲我現在有正確的數字...需要再驗證一些樣本 – Matt

相關問題