在 SQL 中使用相对列名值计算 DATE 值

Som*_*azz 1 sql t-sql sql-server sql-server-2019

我有一个表,其中有一些特殊的数据排列,其中有 28-31 列对应于一系列唯一 ID 的月份日期。我想做的是将其转化为具有实际日期值的更可行的格式。我的表格如下所示:

DECLARE @Month VARCHAR(3) 
SET @Month = 'NOV'
Run Code Online (Sandbox Code Playgroud)
ID 地位 1 2 3 4 5
111 积极的 A 2 3 4 Z
222 不活跃 Z 5 F 6 7

理想情况下,我希望有一种方法可以将其转换为如下所示的内容:

ID 地位 日期 价值
111 积极的 11/1/2022 A
111 积极的 11/2/2022 2
111 积极的 11/3/2022 3
111 积极的 11/4/2022 4
111 积极的 11/5/2022 Z
222 不活跃 11/1/2022 Z
222 不活跃 11/2/2022 5
222 不活跃 11/3/2022 F
222 不活跃 11/4/2022 6
222 不活跃 11/5/2022 7

在对性能进行一些小的考虑的情况下,对于列数(相对于一个月中的不同天数)灵活的方法将是更可取的。

Joh*_*tti 5

一种选择是使用 JSON 来“动态”反转数据

Select A.[ID]
      ,A.[Status]
      ,[Date] = datefromparts(2022,11,[key])
      ,Value
 From  YourTable A
 Cross Apply  (
                 Select [Key]
                       ,[Value]
                  From  OpenJson(  (Select A.* For JSON Path,Without_Array_Wrapper )  ) 
                  Where [Key] not in ('ID','Status')
              ) B
Run Code Online (Sandbox Code Playgroud)

结果

ID  Status  Date        Value
111 Active  2022-11-01  A
111 Active  2022-11-02  2
111 Active  2022-11-03  3
111 Active  2022-11-04  4
111 Active  2022-11-05  Z
Run Code Online (Sandbox Code Playgroud)