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 |
在对性能进行一些小的考虑的情况下,对于列数(相对于一个月中的不同天数)灵活的方法将是更可取的。
一种选择是使用 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)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |