SQL表转换:使用SELECT中IF语句拆分列内文本为独立行的实现方案
宽表结构工作日日历转长表格式实现方案
存储现状
当前使用的是宽格式的美国节假日工作日标识表,存储规则如下:
- 每一行对应一个自然年份
Year字段存储年份值Mon1到Mon12字段分别对应1-12月,每个字段值是长度等于当月天数的连续0/1字符串,字符串内第N位的取值对应当月第N天的状态:1代表工作日,0代表非工作日
源表存储示例:
Year Mon1 Mon2 ... Mon12 2025 1110001110001101 0010111010110110 2024 000111011011101 0101101110110101
转换目标
需要将现有宽表转换为逐行对应单个自然日的长格式表,输出字段要求:
Year:对应记录所属的年份Month:两位格式的所属月份(如1月统一输出为01)Day:两位格式的所属日期(如当月1日统一输出为01)Working day:对应日期的工作日状态,取值为0或1
目标表输出示例:
Year Month Day Working day 2025 01 01 0 2025 01 02 1
参考示意图


实现说明
仅依靠SELECT语句中的IF条件判断,无法完成本次转换需要的列转行、字符串按位拆分生成独立行的操作,这类需求的核心依赖两类SQL能力落地:
- 列转行能力:将横向排列的
Mon1到Mon12共12个月份字段,整合为纵向排列的「年份、月份序号、当月0/1状态字符串」中间结果集 - 字符串逐位拆分能力:对每个月份对应的0/1字符串,逐字符拆分为独立行——拆分出的第N个字符对应的位置,就对应当月的第N天,最后将位置值格式化为两位的日期格式,取出对应位置的0/1值作为工作日标识输出即可。
内容的提问来源于stack exchange,提问作者brandon12345
相关产品推荐
相关产品推荐

