SQL 日期条件的服务器案例语句
SQL Server Case statement for date condition
我有一个 SQL table,它保留 ProductCode
、Start_Date
、End_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
我有一个 SQL table,它保留 ProductCode
、Start_Date
、End_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 |