CASE更新失败

时间:2018-11-17 00:25:26

标签: sql sql-server tsql

我正在尝试编写一个查询,该查询将根据在特定时间段内售出的商品数量来更新reorder_level

with a as (select invoice_itemized.itemnum, inventory.itemname, 
sum(invoice_itemized.quantity) as sold 

from invoice_itemized 

join inventory on invoice_itemized.itemnum=inventory.itemnum and 
inventory.vendor_number='COR' and inventory.dept_id='cigs' 

join invoice_totals on 
invoice_itemized.invoice_number=invoice_totals.invoice_number and 
invoice_totals.datetime>=dateadd(month,-1,getdate())

group by invoice_itemized.itemnum, inventory.itemname)

update inventory 

set reorder_level = case when a.sold/numpervencase>=5 then 30
                         when a.sold/numpervencase>=2 then 20
                         when a.sold/numpervencase>=1 then 5
                         else 1 end, 
reorder_quantity = 1

from a 

join inventory_vendors on a.itemnum=inventory_vendors.itemnum

update替换select完全按照预期执行,从case返回正确的结果并选择94行。

在放置update的情况下,受更新影响的所有区域(6758)都设置为1。

2 个答案:

答案 0 :(得分:1)

运行此命令,然后查看结果:

with a as (select invoice_itemized.itemnum, inventory.itemname, 
sum(invoice_itemized.quantity) as sold 

from invoice_itemized 

join inventory on invoice_itemized.itemnum=inventory.itemnum and 
inventory.vendor_number='COR' and inventory.dept_id='cigs' 

join invoice_totals on 
invoice_itemized.invoice_number=invoice_totals.invoice_number and 
invoice_totals.datetime>=dateadd(month,-1,getdate())

group by invoice_itemized.itemnum, inventory.itemname)

select a.sold, numpervencase, a.sold/numpervencase, 
case 
  when a.sold/numpervencase>=5 then 30
  when a.sold/numpervencase>=2 then 20
  when a.sold/numpervencase>=1 then 5
  else 1 
end, 
*

from a 

join inventory_vendors on a.itemnum=inventory_vendors.itemnum

最好在更新前选择一个好主意,以检查数据是否如预期的那样

  

受更新影响的所有区域都设置为1

我将原料放入上面的查询中;看看总和是否按预期计算。您可能需要将其中一个操作数转换为带小数位的内容:

1/2 = 0
1.0/2 = 0.5
  

它更新的行比我预期的要多

该选择项中的每一行都会更新。确定您不想更新的行,并在其中放置where子句以将其删除

  

我是否想得太多?

测试不足,也许

  

我什至需要cte吗?

使表示起来更容易,但是不,您可以通过将cte的内容作为子查询粘贴到其中来获得相同的结果。这正是数据库所做的(有效的)

  

我的发件人陈述是否放在错误的地方?

我们不知道您要得到什么结果,因此除了“这样做可能会产生语法错误,所以..不”之外,我们都无法回答

实际问题似乎是

  • 您总是遇到ELSE的情况,找出原因
  • 您的cte选择了太多行(我无法确定您发布的电话号码是您得到的电话号码还是您期望的电话号码,但是没有示例数据就很没意思了),找出原因

答案 1 :(得分:0)

已解决。当我向join添加另一个update时,它可以正常工作。我必须添加join inventory on inventory_vendors.itemnum=inventory.itemnum