[英]SQL Converting Columns to Rows
我想執行以下轉換:
Seniority Price Rating
---------------------------
1 P1 R1
2 P2 R2
3 P3 R3
至
Value RowId ColId
------------------
1 0 0
P1 0 1
R1 0 2
2 1 0
P2 1 1
R2 1 2
3 2 0
P3 2 1
R3 2 2
如果可能的話,我想在轉換后的表中保留字段名稱,即所有 rowid=0 的行都將添加優先級作為字段,rowid=1 將具有價格,依此類推。
這是一個使用 JSON 的選項,如果 2016+ XML 版本可用於舊版本。
例子
Declare @YourTable Table ([Seniority] varchar(50),[Price] varchar(50),[Rating] varchar(50))
Insert Into @YourTable Values
(1,'P1','R1')
,(2,'P2','R2')
,(3,'P3','R3')
Select B.Value
,A.RowID
,B.ColID
From (Select *
,RowID = row_number() over (order by (select null)) - 1
From @YourTable --<<< Replace with virtually any table.
) A
Cross Apply (
Select *
,ColID = row_number() over (order by (select null)) - 1
From OpenJson( (Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES ) )
Where [Key] not in ('RowID')
) B
退貨
編輯 - 只是為了好玩,XML 版本
Select C.Value
,A.RowID
,C.ColID
From (Select *
,RowID = row_number() over (order by (select null)) - 1
From @YourTable
) A
Cross Apply ( values ( convert(xml,(Select A.* for XML RAW)) ) ) B(XMLData)
Cross Apply (
Select ColID = row_number() over( order by (select null)) - 1
,Value = xAttr.value('.','varchar(max)')
From XMLData.nodes('//@*') xNode(xAttr)
Where xAttr.value('local-name(.)', 'varchar(100)') not in ('RowID')
) C
編輯——XML 版本允許 NULL 值
Declare @YourTable Table ([Seniority] varchar(50),[Price] varchar(50),[Rating] varchar(50))
Insert Into @YourTable Values
(1,'P1','R1')
,(2,'P2','R2')
,(3,NULL,'R3') -- Forced a NULL value
Select C.Value
,A.RowID
,C.ColID
From (Select *
,RowID = row_number() over (order by (select null)) - 1
From @YourTable
) A
Cross Apply ( values ( convert(xml,(Select A.* for XML RAW,ELEMENTS XSINIL)) ) ) B(XMLData)
Cross Apply (
Select Item = attr.value('local-name(.)','varchar(100)')
,Value = attr.value('.','varchar(max)')
,ColID = row_number() over (order by (select null)) - 1
From XMLData.nodes('/row') as C1(nd)
Cross Apply C1.nd.nodes('./*') as C2(attr)
Where attr.value('local-name(.)','varchar(100)') not in ('RowID')
) C
退貨
Value RowID ColID
1 0 0
P1 0 1
R1 0 2
0 0 3
2 1 0
P2 1 1
R2 1 2
1 1 3
3 2 0
2 1 --<< Notice NULLs return as Empty Strings
R3 2 2
2 2 3
作為一般方法, union all
工作:
select seniority, 'seniority' as which, seniority - 1, 0
from t
union all
select p1, 'p1' as which, seniority - 1, 1
from t
union all
select r1, 'r1' as which, seniority - 1, 2
from t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.