SQL 日期条件的服务器案例语句

SQL Server Case statement for date condition

我有一个 SQL table,它保留 ProductCodeStart_DateEnd_date 和不同产品的价格。我想从这个 table 创建一个视图并创建一个条件列 'Status' 我需要根据它的年龄分配产品的状态我想在每一行上保持相同的状态. 如何编写 'case' 语句来创建列 'Status'?

如果 ProductCode 在 2019 年开始 - 'Old',如果它在 2020 年开始 - 'Mature',如果它在 2021 年开始 - 'New'.

编辑:为加入更新。

SELECT 
    t.productcode
    ,Start_Date
    ,End_Date
    ,Price
    ,s.Status
FROM t1 as t
INNER JOIN (
    SELECT
        productcode
        ,CASE 
            WHEN MIN(Start_Date) = 2019 THEN 'Old'
            WHEN MIN(Start_Date) = 2020 THEN 'Mature' 
            WHEN MIN(Start_Date) = 2021 THEN 'New'
            ELSE 'Unknown'
        END AS Status
    FROM t1
    group by productcode
) as s on t.productcode = s.productcode

一般来说,您不想对这些值进行硬编码,而是使用一些逻辑来确定旧的、成熟的和新的。随着时间的推移,2021 年将变成 Mature,然后是 Old,依此类推。有人需要记住维护它并更新年份。根据您的要求,根据数据中的最大日期或使用 GETDATE() 的当前日期使用 DATEDIFF 会更明智。

如果我对你的问题的理解正确,你需要 CASE 表达式和窗口 MIN():

的组合
SELECT 
   *,
   CASE 
      WHEN MIN(Start_Date) OVER (PARTITION BY Product_Code) = 2019 THEN 'Old'
      WHEN MIN(Start_Date) OVER (PARTITION BY Product_Code) = 2020 THEN 'Mature'
      WHEN MIN(Start_Date) OVER (PARTITION BY Product_Code) = 2021 THEN 'New'
      ELSE ''
   END AS Status
FROM (VALUES
   ('abc10', 2019, 2020, 10),
   ('abc10', 2020, 2021, 11),
   ('abc10', 2021, 2025, 12),
   ('abc11', 2020, 2021, 10),
   ('abc11', 2021, 2025, 12),
   ('abc12', 2021, 2025, 15)
) t (Product_Code, Start_Date, End_Date, Price)
ORDER BY Product_Code, Start_Date

结果:

Product_Code Start_Date End_Date Price Status
abc10 2019 2020 10 Old
abc10 2020 2021 11 Old
abc10 2021 2025 12 Old
abc11 2020 2021 10 Mature
abc11 2021 2025 12 Mature
abc12 2021 2025 15 New