【问题标题】:An aggregate may not appear in the set list of an UPDATE statement T-SQL聚合可能不会出现在 UPDATE 语句 T-SQL 的集合列表中
【发布时间】:2018-03-08 16:04:12
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server tsql sql-update


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用以下列构建一个 SELECT 查询:

      1. [Exchequer].[ASAP01].[STOCK] 表的主键
      2. 新想要的stUserField7

      鉴于原始问题中的MIN(tlLineDate) 表达式,如果此SELECT 查询没有GROUP BY 子句或更改为使用APPLY 而不是JOIN,您可能已经做了一些事情错了。

      获得该查询后,在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)>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        相关资源
        最近更新 更多