SQL Server:根据值的选择使用同一个表中的值更新列

时间:2016-06-30 18:16:52

标签: sql sql-server sql-server-2012 sql-update

我有一个包含库存物品的表,其中相同的物品可以存储在多个地方(即总数量= 3,1存储在橱柜中,2在冰箱中,0在食品室中)。其中每个都有一个" 20"。

的条目类型

还有一些行的输入类型为" 10"控制总数。所以,在我的程序中,我看到"可用"作为条目类型" 10",并且可以通过查看条目类型" 20"来查看每个地点的数量。

在运行一些更新之后,我注意到它花了我的" 10"即使在" 20"中有项目,类型也为零行(在某一组项目上,我有一个列表包含在" IN"语句中以仅更改那些行)

我希望用某种CASE声明(我认为)更新该表以强制使用" 10"条目等于" 20"条目。

表格如下:

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

3 个答案:

答案 0 :(得分: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条件。

答案 1 :(得分:2)

假设ENTRYTYPE = 10始终是您希望更新总数量的记录:

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

答案 2 :(得分: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;