我正在尝试编写一个查询,该查询将根据在特定时间段内售出的商品数量来更新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。
答案 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的内容作为子查询粘贴到其中来获得相同的结果。这正是数据库所做的(有效的)
我的发件人陈述是否放在错误的地方?
我们不知道您要得到什么结果,因此除了“这样做可能会产生语法错误,所以..不”之外,我们都无法回答
实际问题似乎是
答案 1 :(得分:0)
已解决。当我向join
添加另一个update
时,它可以正常工作。我必须添加join inventory on inventory_vendors.itemnum=inventory.itemnum