[去年使用另一个表中的计算更新列

问题描述 投票:0回答:2

我试图通过突出显示销售少于12的项目作为“ D”(停用)来更新(使用三个表的内部联接)表STAT的项目统计IM_ITEM

第二表PS_TKT_HIST_LIN的每一天都有每个项目的售出数量列QTY_SOLD和日期列BUS_DAT

我还需要第三个表IM_INV来过滤数据,我需要说这些商品的最后接收日期LST_RECV_DAT早于“ 2019-01-01”,而最后销售日期LST_SAL_DAT则晚于“ 2019-01-01”。我使用了以下代码

 UPDATE M
    SET M.STAT = 'D'
FROM
    dbo.IM_ITEM AS M
INNER JOIN
    IM_INV AS N
ON
    M.ITEM_NO = N.ITEM_NO
INNER JOIN
    dbo.PS_TKT_HIST_LIN S`
ON
    M.ITEM_NO  = S.ITEM_NO
WHERE
    CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, N.LST_RECV_DAT))) <= '2019-01-01'
AND CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, N.LST_SAL_DAT))) >= '2019-01-01'
AND M.STAT = 'A' 
AND SUM(case when DATEPART(YYYY, (BUS_DAT)) = DATEPART(YYYY, DATEADD(YYYY, -1, getdate()))
        AND DATEPART(yyyy, (BUS_DAT)) = DATEPART(yyyy, DATEADD(YYYY, -1, getdate()))
        then qty_sold else 0)<12

带有错误任何建议请

sql-server date sql-update inner-join calculated-columns
2个回答
1
投票

您应该使用HAVING子句,而不要使用Sum中的where

您可以使用CTE来获取该值,然后进行相应的更新。

;with cte as(
  select ITEM_NO, ..
  from ..
  group by ITEM_NO
  having  .. < 12
)

update M
set SET M.STAT = 'D'
from dbo.IM_ITEM AS M
inner join cte on M.ITEM_NO = cte.ITEM_NO

0
投票

除非在子查询中定义,否则您不能在where子句中使用aggregate函数。

© www.soinside.com 2019 - 2024. All rights reserved.