SQL表转换-在“Select”命令中使用“if”语句将列中的文本拆分为它们自己的行

SQL表转换-在“Select”命令中使用“if”语句将列中的文本拆分为它们自己的行,sql,hana,Sql,Hana,我有一个以下格式的源日期表: Year Mon1 Mon2 ... Mon12 2025 1110001110001101 0010111010110110 2024 000111011011101 0101101110110101 这是源表。这是一个日历表,月列中的每个1或0表示一天,1表示工作日,0表示根据美国假日日历计算的每年未工作日 我希望将此表转换为以下格式,如图2所示 Year Month Day Working d

我有一个以下格式的源日期表:

Year  Mon1              Mon2      ...      Mon12
2025  1110001110001101  0010111010110110
2024  000111011011101   0101101110110101
这是源表。这是一个日历表,月列中的每个1或0表示一天,1表示工作日,0表示根据美国假日日历计算的每年未工作日

我希望将此表转换为以下格式,如图2所示

Year  Month   Day  Working day
2025  01      01   0
2025  01      02   1
整张桌子

有人知道实现这一目标的方法吗

自下而上方法:

步骤1:表单查询以提取特定年份的各个月份列

步骤2:应用拆分\字符串拆分\到\表逻辑以将列转换为行。提及

步骤3:将这些列的case语句应用于行表,以确定这是工作日还是非工作日

第四步:合并每个月的所有结果


步骤5:对所有年份重复此逻辑。

提到的源表是SAP factory日历表。 我已经在中详细解释了这一点

由于日历计算非常常见,SAP HANA附带了助手函数,可以采用factory calendar table TFACS格式并处理数据,而无需进行复杂的转换

对于上述场景,可以使用WORKDAYS_BETWEEN函数,请参见

在我的示例中,我维护了2018年的表TFACS。 通过日历通用查询,我生成2018年1月1日至2019年1月1日之间所有日期的日期。 对于每一天,都会为序列生成日期表函数的当前和次日时段开始和时段结束调用WORKDAYS BETWEEN函数,以确定这是否是工作日

如果在TFACS中找不到条目,则函数的结果为空


请注意,还有一个名为ADD_WORKDAYS的函数,当要求不仅将日历与工作日制成表格,而且进行计算并将工作日考虑在内时,该函数非常方便。

至少,您需要标记您正在使用的数据库。感谢您的输入-该数据库是SAP/HANA数据库,我正在使用microsoft SQL中的SQL规则进行查询。我从来不知道这个概念存在!因此,这些函数在不显式引用TFACS表的情况下工作?WORKDAY函数采用可选参数来指定要使用的TFACS表的模式。请参阅文档。
WITH calendar AS (
    SELECT
        GENERATED_period_start AS start_day,
        GENERATED_period_end AS end_day
    FROM 
        series_generate_date('INTERVAL 1 DAY', '2018-01-01', '2019-01-01' )
)
SELECT 
    cal.start_day AS cal_day,
    DAYNAME( cal.start_day) day_name,
    workdays_between ('AU', cal.start_day, cal.end_day, 'SYSTEM') AS workday
    
FROM 
     calendar cal;

CAL_DAY   |DAY_NAME |WORKDAY|
----------|---------|-------|
2018-01-01|MONDAY   |      0|
2018-01-02|TUESDAY  |      1|
2018-01-03|WEDNESDAY|      1|
[...]
2018-12-28|FRIDAY   |      0|
2018-12-29|SATURDAY |      1|
2018-12-30|SUNDAY   |       | <-- date not maintained in TFACS
2018-12-31|MONDAY   |       | <--/