SQL如何根据年份、季度字段列出对应季度包含的所有月份
问题背景
我已编写SQL代码实现如下逻辑:识别以Q1、Q2、Q3、Q4开头的字符串,匹配输出对应季度的起始月份,测试代码如下:
CREATE TABLE #Test ( name VARCHAR (20) NOT NULL ); INSERT INTO #Test (name) VALUES ('Q324'), ('Q224'); SELECT name ,[Year] = '20' + RIGHT(name,2) ,[QuarterStartMonth] = CASE WHEN LEFT(name,2) = 'Q1' THEN '01' WHEN LEFT(name,2) = 'Q2' THEN '04' WHEN LEFT(name,2) = 'Q3' THEN '07' WHEN LEFT(name,2) = 'Q4' THEN '10' ELSE NULL END from #Test;
运行上述代码得到的输出表示意图:
现在需要进一步展示每个季度对应的所有月份,预期输出格式如下:
Name Year Quarter MonthYear Q324 2024 03 Jul-24 Q324 2024 03 Aug-24 Q324 2024 03 Sep-24
实现方案
以下是SQL Server环境下的实现代码,通过生成3行的偏移量辅助表,将单条季度数据拆分为3条月份数据,再做日期格式化即可:
-- 生成0、1、2三个月份偏移量 WITH MonthOffset AS ( SELECT 0 AS offset UNION ALL SELECT 1 UNION ALL SELECT 2 ) SELECT t.name AS [Name] ,[Year] = '20' + RIGHT(t.name,2) ,[Quarter] = RIGHT('0' + RIGHT(LEFT(t.name,2),1), 2) -- 提取季度并补为两位格式 ,[MonthYear] = FORMAT( DATEADD(MONTH, m.offset + CAST(CASE LEFT(t.name,2) WHEN 'Q1' THEN 0 WHEN 'Q2' THEN 3 WHEN 'Q3' THEN 6 WHEN 'Q4' THEN 9 END AS INT), CAST('20' + RIGHT(t.name,2) AS INT)), 'MMM-yy' ) FROM #Test t CROSS JOIN MonthOffset m ORDER BY t.name, m.offset;
代码逻辑说明:
- CTE
MonthOffset生成0、1、2三个偏移量,和原表做交叉连接后每个季度会自动生成3行对应三个月份的数据 - 季度编号直接提取
name字段中Q后的数字,补前缀0即可得到两位格式的季度值 - 用
DATEADD基于季度起始月份加上偏移量得到每个月的日期,再用FORMAT函数格式化为MMM-yy格式,即可得到Jul-24这类预期输出
运行上述代码即可得到和要求完全一致的结果。
内容的提问来源于stack exchange,提问作者jcoke
相关产品推荐
相关产品推荐

