簡體   English   中英

根據另一個表中的有序值更新列

[英]Update a column based on ordered values from another table

當相關表 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) 

請有人幫助我,應該怎么做?

據我了解您的問題,您想要最新的銷售項目記錄。

您可以使用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) 

我認為您的查詢過於復雜。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM