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

9jyewag0  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(151)

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

DECLARE @Month VARCHAR(3) 
SET @Month = 'NOV'

| 识别号|现况|1个|第二章|三个|四个|五个|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 一百一十一|活跃|A类|第二章|三个|四个|Z型|
| 二百二十二|未激活|Z型|五个|f级|六个|七|
我想理想的是有一种方法来转换成类似下面的东西:
| 识别号|现况|日期|价值|
| - ------|- ------|- ------|- ------|
| 一百一十一|活跃|2022年11月1日|A类|
| 一百一十一|活跃|2022年11月2日|第二章|
| 一百一十一|活跃|2022年11月3日|三个|
| 一百一十一|活跃|2022年11月4日|四个|
| 一百一十一|活跃|2022年11月5日|Z型|
| 二百二十二|未激活|2022年11月1日|Z型|
| 二百二十二|未激活|2022年11月2日|五个|
| 二百二十二|未激活|2022年11月3日|f级|
| 二百二十二|未激活|2022年11月4日|六个|
| 二百二十二|未激活|2022年11月5日|七|
对于列数灵活的方法(相对于一个月中的不同天数)更可取,但要对性能进行一些小的考虑。

yhxst69z

yhxst69z1#

一种选择是使用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

结果

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

相关问题