2014-11-03 54 views
2

Items
ItemCode ---名稱-------股票
111 -----------書--------- 10
112 -----------包----------- 03
113 ---------- -Pen ----------- 08
114 ----------- --------鉛筆13更新表給出了意想不到的結果


INVOICEITEMS(SoldItems)
BillNumber --- ItemCode ----- UnitValue(數量)
1005 ----------- 111 ------------------ 3
1005 ----------- 111 ------------------ 2
1005 ----------- 113 ---------------- --4
1006 ----------- 111 ------------------ 6
1007 ---------- -112 ------------------ 5


我們需要更新​​表中的ITEMS表。
我們需要從INVOICEITEMS中的BillNumber'1005'的UnitValues的總和中添加ITEMS表中每個ItemCode的庫存。

查詢使用:
UPDATE ITEMS SET Stock=Stock+(SELECT SUM(T.UnitValue) FROM INVOICEITEMS T WHERE T.BillNumber LIKE '1005' AND T.ItemCode LIKE ItemCode) WHERE ItemCode IN(SELECT J.ItemCode FROM INVOICEITEMS J WHERE J.BillNumber LIKE '1005')


預期結果更新用後:
表中的項目
ItemCode ---名稱----股票
111 --------- --Book ------- 15
112 ----------- Bag --------- 03
113 -----------筆--------- 12
114 -----------鉛筆------ 13

結果我們得到:
表中的項目
ItemCode ---名稱----股票
111 -----------書-------- 19
112 ----------- Bag --------- 03
113 ----------- Pen --------- 17
114 -----------鉛筆------- 13


請幫助更正此查詢。

回答

1

調查update語句問題的一種方法是將它們轉換爲select語句。爲了您的更新語句,我想出了以下查詢:

SELECT Items.* 
    ,(SELECT SUM(T.UnitValue) FROM INVOICEITEMS T WHERE T.BillNumber LIKE '1005' AND T.ItemCode LIKE ItemCode) 
FROM Items 
WHERE ItemCode IN(SELECT J.ItemCode FROM INVOICEITEMS J WHERE J.BillNumber LIKE '1005') 

正如你所看到的,最後一列是9的每一行,因爲你沒有做任何返回基於不同的價值觀,這並不奇怪你正在看哪一排。 然後,您可以更改select語句返回數據你想:

SELECT Items.ItemCode 
    ,Items.Stock 
    ,SUM(T.UnitValue) 
    ,Items.Stock + SUM(T.UnitValue) 
FROM Items 
JOIN INVOICEITEMS T ON T.ItemCode = Items.ItemCode 
WHERE T.BillNumber = 1005 
GROUP BY Items.ItemCode, Items.Stock 

最後,你可以結合回到UPDATE語句:

UPDATE Items SET Stock = NewSum 
FROM Items JOIN 
    (SELECT Items.ItemCode 
     ,Items.Stock 
     ,Items.Stock + SUM(INVOICEITEMS.UnitValue) NewSum 
    FROM Items 
    JOIN INVOICEITEMS ON INVOICEITEMS.ItemCode = Items.ItemCode 
    WHERE INVOICEITEMS.BillNumber = 1005 
    GROUP BY Items.ItemCode, Items.Stock 
    ) T ON T.ItemCode = Items.ItemCode 

它可能然後是審慎的提取硬從子查詢中編碼的值,並使它們成爲更高級別查詢的一部分。這可能是一個好主意的原因之一是因爲子查詢更便攜。那麼你最終會得到這個:

UPDATE Items SET Stock = NewSum 
FROM Items JOIN 
    (SELECT Items.ItemCode 
     ,INVOICEITEMS.BillNumber 
     ,Items.Stock 
     ,SUM(INVOICEITEMS.UnitValue) InvoiceQty 
     ,Items.Stock + SUM(INVOICEITEMS.UnitValue) NewSum 
    FROM Items 
    JOIN INVOICEITEMS ON INVOICEITEMS.ItemCode = Items.ItemCode 
    GROUP BY Items.ItemCode, Items.Stock, INVOICEITEMS.BillNumber 
    ) T ON T.ItemCode = Items.ItemCode 
WHERE T.BillNumber = 1005 
+0

+1提到轉換爲SELECT語句,以查看它在做什麼查詢!很多人都沒有想到,這是一個簡單的故障排除提示! – Leslie 2014-11-03 17:18:05

1

AND T.ItemCode LIKE ItemCode SQL中的行沒有執行,因爲ItemCode在執行內部SQL語句之前未在SQL中指定。

合夥人ItemCode明確與ITEMS表,它會工作。

+0

你能編輯我的查詢並將其發回嗎? – Pooh 2014-11-03 15:58:03

+0

@ 5uperdan提到的查詢應該可以工作。如果您遇到任何問題,請告訴我們。 – 2014-11-03 16:05:17

0

那麼,在這種情況下,你可以使用存儲過程或函數:

例如定義一個函數

CREATE FUNCTION getItemSum(@BillID int, @ItemID int) 
RETURNS int 
AS 
-- Returns the stock level for the product. 
BEGIN 
    DECLARE @ret int; 
    SELECT @ret = SUM(UnitValue) 
    FROM INVOICEITEM p 
    WHERE p.ITEMCODE = @ItemID 
     AND p.BillNumber = @BillID; 
    IF (@ret IS NULL) 
     SET @ret = 0; 
    RETURN @ret; 
END; 
GO 

,並調用SQL語句是這樣的:

UPDATE ITEMS 
SET Stock=Stock + getItemSum(1005, ItemCode) 
GO 
0

一種方式做,這是使用一個子查詢中使用聯接:

UPDATE items 
SET Stock += item_qty_sum 
FROM items i 
INNER JOIN (
      SELECT itemcode, SUM(unitvalue) AS item_qty_sum 
      FROM INVOICEITEMS 
      WHERE BillNumber = 1005 
      GROUP BY ItemCode 
     ) ii 
ON ii.ItemCode = i.ItemCode 

Sample SQL Fiddle顯示在行動中提供所需結果的查詢。

相關問題