Sql 更新失败,大小写为

Sql 更新失败,大小写为,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试编写一个查询,它将根据特定时间段内售出的商品数量更新reorder_级别 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.ve

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

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
用select替换更新将完全按照预期执行,从案例中返回正确的结果并选择94行


更新到位后,受更新6758影响的所有区域都设置为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的内容作为子查询粘贴到中来获得相同的结果。。不管怎样,这就是db的有效功能

我的from声明放错地方了吗

我们不知道您想要的是什么结果,因此无法对其进行分析。这样做可能会产生语法错误,因此。。没有

实际问题似乎是

当你的案件总是要去其他地方,找出原因 您的cte选择了太多行,我无法判断您发布的数字是您得到的数字还是您期望的数字,但如果没有示例数据,这是非常没有意义的,请找出原因
解决了。当我向更新添加另一个连接时,它工作正常。我必须在inventory\u供应商上添加join inventory。itemnum=inventory.itemnum

数量和numpervencase的数据类型是什么?听起来您可能有整数除法问题。另外,如果您注释掉更新库存及其后的所有内容,并插入select*from a,您是否得到了预期的结果?i、 e.您与这些特定供应商条件的总和是否如预期的那样有效?您不需要CTE。仅仅是一个带有join的更新并不能告诉你什么是错误的,因为你根本没有提供足够的信息。要验证查询,请首先将更新更改为SELECT查询,并检查返回的行是否为必需行。一旦选择查询正确,只需将其更改为更新查询请阅读有关改进问题的一些提示。因此,此选择仅返回94行,这与我的预期相符。它还返回a.sell/numpervencase的正确值,并正确显示小数。case语句也正常工作,并返回我想要的值。那么是什么差异导致更新版本执行不正确?