聚合可能不会出现在UPDATE语句T-SQL的集合列表中

时间:2018-03-08 16:04:12

标签: sql sql-server tsql sql-update

在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)

2 个答案:

答案 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查询:

  1. [Exchequer].[ASAP01].[STOCK]
  2. 的主键
  3. 新的所需stUserField7
  4. 根据原始问题中的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)>