2014-11-03 83 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显示在行动中提供所需结果的查询。

相关问题