在T-SQL中,我试图通过获取今天和日期之间的采购订单之间的差异来更新库存用户字段,其中包含我们希望将其交付给我们的周数。但是,如果包含该产品的多个采购订单(显然),则选择查询可以返回多个采购订单行。我想采用它返回的最小数字/最小值,但显然不能在更新查询中执行此操作。有人可以推荐一种解决方法吗?感谢。
UPDATE [Exchequer].[ASAP01].[STOCK]
SET stUserField7 = DATEDIFF(day,CONVERT(VARCHAR(8), GETDATE(), 112),min(tlLineDate)) / 7 + 1
FROM [Exchequer].[ASAP01].[STOCK]
JOIN [Exchequer].[ASAP01].[CUSTSUPP]
ON stSupplier = acCode
JOIN [Exchequer].[ASAP01].[DETAILS]
ON stCode = tlStockCodeTrans1
WHERE stSupplier <> '' AND stQtyOnOrder > '0' AND stQtyOnOrder > stQtyAllocated
AND tlOurRef like 'POR%' AND (floor(tlQtyDel) + floor(tlQtyWOFF)) < floor(tlQty)
AND tlLineDate >= CONVERT(VARCHAR(8),GETDATE(), 112)
答案 0 :(得分:1)
为什么要将日期转换为varchar以获得差异?
这不是日期,而是如何在更新中使用窗口功能
declare @maps table(name varchar(10), isUsed bit, code varchar(10));
insert into @Maps values
('NY', 1, 'NY1')
, ('NY', 0, 'NY2')
, ('FL', 0, 'FL1')
, ('TX', 0, 'TX1')
declare @Results table (id int identity primary key, Name varchar(20), Value int, Code varchar(20), cnt int)
insert into @results values
('FL', 12, 'FL1', null)
, ('TX', 54, 'TX1', null)
, ('TX', 56, 'TX1', null)
, ('CA', 50, 'CA1', null)
, ('NJ', 40, 'NJ1', null)
select * from @results
order by name, Value desc
update r
set r.cnt = tt.cnt
from @results r
join ( select id, max(value) over (partition by name) as cnt
from @Results
) tt
on r.id = tt.id
select * from @results
order by name, value desc
答案 1 :(得分:0)
使用以下列的列构建SELECT
查询:
[Exchequer].[ASAP01].[STOCK]
表stUserField7
根据原始问题中的MIN(tlLineDate)
表达式,如果此SELECT
查询没有GROUP BY
子句或更改为使用APPLY
而不是{JOIN
1}},你可能做错了什么。
获得该查询后,请在UPDATE
语句中使用它,如下所示:
UPDATE s
SET s.stUserField7 = t.NewValueFromSelectQuery
FROM [Exchequer].[ASAP01].[STOCK] s
INNER JOIN (
--- your new SELECT query here
) t ON t.<primary key field(s)> = s.<primary key field(s)>