使用CASE WHEN按日期所属季度提取对应Metric_Type的Metric_Value值
问题原因
你之前将匹配逻辑写在了SELECT段的CASE表达式中,该语法仅用于调整返回字段的计算值,不会对数据源的行进行过滤,因此会返回全表所有行,仅对符合条件的行返回正确的Metric_Value,其余行返回0。
如果需要仅保留符合条件的行,需要将匹配规则放在WHERE条件中进行行过滤。
实现方案
首先明确季度和Metric_Type的映射规则,按照你给出的示例Q1对应v1,假设后续季度映射为Q2对应v1.2、Q3对应v1.3,可参考如下写法:
SELECT Date, Metric_Type, Metric_Value FROM 你的表名 WHERE (QUARTER(Date) = 1 AND Metric_Type = 'v1') OR (QUARTER(Date) = 2 AND Metric_Type = 'v1.2') OR (QUARTER(Date) = 3 AND Metric_Type = 'v1.3') -- 按需补充其他季度和版本的对应规则
如果你仅需要查询特定季度的匹配数据,比如仅查第一季度的对应数据,可直接简化为:
SELECT Date, Metric_Type, Metric_Value FROM 你的表名 WHERE QUARTER(Date) = 1 AND Metric_Type = 'v1'
如果后续季度和版本的映射规则会持续更新,更推荐单独维护一张季度版本映射配置表,通过关联查询避免每次修改SQL硬编码规则,示例如下:
- 新建映射表
quarter_metric_map,包含Quarter(季度数值)、Metric_Type(对应版本号)两个字段 - 关联查询SQL:
SELECT t.Date, t.Metric_Type, t.Metric_Value FROM 业务表 t INNER JOIN quarter_metric_map m ON QUARTER(t.Date) = m.Quarter AND t.Metric_Type = m.Metric_Type
后续版本更新只要维护映射表的数据即可,无需修改SQL代码。
提示:如果你的
Date字段为字符串类型存储(示例中为dd/mm/yyyy格式),使用QUARTER函数前需要先转换为日期类型,比如MySQL中可替换为STR_TO_DATE(Date, '%d/%m/%Y'),其他数据库可对应使用日期转换函数处理。
内容的提问来源于stack exchange,提问作者Kaushik
相关产品推荐
相关产品推荐

