代码之家  ›  专栏  ›  技术社区  ›  Andy

日期条件的SQL Server案例语句

  •  0
  • Andy  · 技术社区  · 4 年前

    我有一个SQL表 ProductCode , Start_Date , End_date 以及不同产品的价格。我想从这个表中创建一个视图,并创建一个条件列“Status”,我需要根据产品的使用年限来分配产品的状态,我想在每一行上保持该状态不变。 如何编写“case”语句来创建“Status”列?

    如果产品代码在2019—“旧”中启动,如果它在2020—“成熟”中启动,如果它在2021—“新”中启动。

    Desired view

    2 回复  |  直到 4 年前
        1
  •  3
  •   Zhorov    4 年前

    如果我正确理解你的问题,你需要 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
    

    结果:

    产品代码 开始日期 结束日期 价格 地位
    abc10 2019 2020 10 古老的
    abc10 2020 二千零二十一 11 古老的
    abc10 二千零二十一 2025 12 古老的
    abc11 2020 二千零二十一 10 成熟
    abc11 二千零二十一 2025 12 成熟
    abc12 二千零二十一 2025 15
        2
  •  1
  •   Edward Radcliffe    4 年前

    编辑:为加入更新。

    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将变成成熟的,然后旧的,等等等等。有人需要记住保持这一点,并更新年份。更明智的做法是使用 DATEDIFF 基于数据中的最长日期或使用 GETDATE() 取决于你的要求。