2016-06-30 97 views
0

我有一個包含庫存項目的表格,其中相同的項目可以存儲在多個位置(即總數量= 3,1存儲在庫中),以及2個在冰箱裏,0個在廚房裏)。其中每個都有一個入口類型「20」。SQL Server:根據值的選擇更新來自同一個表的值的列

也有條目類型爲「10」的行控制總數。因此,在我的程序中,我看到「可用」爲條目類型「10」,並且可以通過查看條目類型「20」查看每個位置數量。

運行了一些更新之後,我發現即使在「20」行中有項目(在某個項目集上,我有一個包含在「IN」語句只改變那些行)

我期待用某種CASE語句(我認爲)強制「10」條目等於「20」條目的SUM來更新該表。

表看起來是這樣的:

ITEM_ID ENTRYTYPE QTY  LOCATION_ID 
------------------------------------------------ 
    A01  10   0  ALL-AVAILABLE <--THIS ROW SHOULD SHOW QTY=3 
    A01  20   1   CABINET 
    A01  20   2   FRIDGE 
    A01  20   0   PANTRY 
    A02  10   0  ALL-AVAILABLE <--THIS ROW SHOULD SHOW QTY=6 
    A02  20   2   CABINET 
    A02  20   2   FRIDGE 
    A02  20   2   PANTRY 

我覺得代碼基本上是一樣的東西:

UPDATE Inventory 
SET qty = SUM(t2.qty) 
FROM Inventory t2 
WHERE (ENTRYTYPE = 10 AND qty = 0) 
    AND ITEM_ID IN (list already generated to be pasted later); 

當然,我不能做這樣的工作,無論出於何種原因。所有幫助讚賞!

TIA

回答

2

您可以使用相關更新。

UPDATE t2 
SET qty = (select SUM(qty) from Inventory where item_id=t2.item_id and ENTRYTYPE = 20) 
FROM Inventory t2 
where ENTRYTYPE=10 AND qty=0 

要限制ITEM_ID的那得到更新,使用where條件。

+0

這似乎並不喜歡第一個「來自」。獲取RED下劃線 – TrayS

+0

稍微改變了這一點以刪除NULL總和,並在SUM之前放置了COALESCE確定。最終是這樣的: UPDATE T2 SET數量=(選擇COALESCE(SUM(數量),0)從庫存其中ITEM_ID = t2.item_id和ENTRYTYPE = 20) 從庫存T2 其中ENTRYTYPE = 10和QTY = 0 – TrayS

2

假設ENTRYTYPE = 10總是要還的總數量在更新記錄:

UPDATE Inventory 
SET qty = (SELECT SUM(qty) FROM Inventory WHERE ENTRYTYPE = 20) 
WHERE ENTRYTYPE = 10 AND qty = 0; 
+0

下來和髒...我喜歡它。 @TrayS,你會想嘗試這個和其他解決方案,看看什麼最適合你的工作量。 –

+1

這會將數量更新爲所有項目的所有數量*的總和,其中輸入類型= 20,這是錯誤的。 –

+0

@vkp - 「我正在用某種CASE語句(我認爲)強制」10「條目等於」20「條目的SUM來更新該表。」 – Nicarus

0

我會使用這樣做可更新的CTE:

with toupdate as (
     select i.*, sum(qty) over (partition by item_id) as sumqty 
     from inventory i 
    ) 
update toupdate 
    set qty = sumqty 
    where entrytype = 20; 
相關問題