【问题标题】:Update a column based on ordered values from another table根据另一个表中的有序值更新列
【发布时间】:2021-01-11 10:56:35
【问题描述】:

当相关表 SoldItems 具有相同的唯一标识符时,我需要更新名为 AccountBase 的表中的标志,但难的是,我需要找到最新销售的产品并将其 SellDatetime 与当前时间进行比较。当 6 年内售出的最新产品时,我想将标志设置为 1,否则设置为 0。

AccountBase 和SoldItems 是1:N 连接的,一个账号可以卖多件商品,所以我需要在SoldItems 中的SellDatetime 下单。

这是我的尝试,但设置不正确,但存在的内部查询返回正确的值:

UPDATE acc 
   SET acc.SoldInLastSixYears = CASE WHEN DATEDIFF(DAY, hk.SellDatetime, GETDATE())/ 365.2425 >= 6 THEN 0
            ELSE 1
            END
FROM [AccountBase] acc INNER JOIN SoldItems hk ON acc.AccountId=hk.Owner
where EXISTS(select top(1) SellDatetime From SoldItems where 
SellDatetime is not null AND Owner is not null 
AND Owner=acc.AccountId   order by SellDatetime desc) 

当我尝试使用内部查询值时出现错误,我 sql 无法识别 'hk':

UPDATE acc 
   SET acc.SoldInLastSixYears = CASE WHEN DATEDIFF(DAY, hk.SellDatetime, GETDATE())/ 365.2425 >= 6 THEN 0
            ELSE 1
            END
FROM [AccountBase] acc 
where EXISTS(select top(1) SellDatetime From SoldItems hk where 
SellDatetime is not null AND Owner is not null 
AND Owner=acc.AccountId   order by SellDatetime desc) 

请高人帮帮我,应该怎么做?

【问题讨论】:

    标签: sql sql-server dynamics-crm


    【解决方案1】:

    据我了解您的问题,您需要最新的销售记录。

    您可以将关联查询与NOT EXISTS 一起使用,如下所示:

    UPDATE acc 
       SET acc.SoldInLastSixYears 
           = CASE WHEN DATEDIFF(DAY, hk.SellDatetime, GETDATE())/ 365.2425 >= 6 THEN 0
                  ELSE 1
             END
    FROM [AccountBase] acc INNER JOIN SoldItems hk ON acc.AccountId=hk.Owner
    where NOT EXISTS(select 1 From SoldItems s where 
    s.Owner=acc.AccountId and s.SellDatetime > hk.SellDatetime) 
    

    【讨论】:

    • 那么您可以接受这个答案,以便将问题标记为已解决。
    【解决方案2】:

    我认为您的查询过于复杂。

    UPDATE acc 
       SET acc.SoldInLastSixYears = (CASE WHEN DATEDIFF(DAY, hk.SellDatetime, GETDATE())/ 365.2425 >= 6
                                         THEN 0 ELSE 1
                                     END)
    FROM AccountBase acc INNER JOIN
         (SELECT hk.Owner, MAX(SellDatetime) as max_SellDateTime
          FROM SoldItems hk
          GROUP BY hk.Owner
         ) hk
         ON acc.AccountId = hk.Owner;
    

    我也不建议通过猜测日期来进行年份比较。而是使用逻辑:

    UPDATE acc 
       SET SoldInLastSixYears = (CASE WHEN hk.SellDatetime <= DATEADD(YEAR, -6, GETDATE()) 
                                      THEN 0 ELSE 1
                                 END)
    FROM AccountBase acc INNER JOIN
         (SELECT hk.Owner, MAX(SellDatetime) as max_SellDateTime
          FROM SoldItems hk
          GROUP BY hk.Owner
         ) hk
         ON acc.AccountId = hk.Owner;
    

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2017-07-24
      相关资源
      最近更新 更多