UNPIVOT將是更好的性能,但是如果你請勿要指定200場,考慮一下:
Declare @YourTable table (DWG varchar(25),Part1 int,Part2 int,Part3 int,Part4 int,Part5 int)
Insert into @YourTable values
('DWG1',0,0,1,2,1),
('DWG2',0,0,0,0,1)
Select C.*
From @YourTable A
Cross Apply (Select XMLData=cast((Select A.* for XML RAW) as xml)) B
Cross Apply (
Select DWG = r.value('@DWG','varchar(25)') --<< case sensitive
,Item = attr.value('local-name(.)','varchar(100)')
,Value = attr.value('.','varchar(max)') --<< can be int if desired
From B.XMLData.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*') as B(attr)
Where attr.value('local-name(.)','varchar(100)') not in ('DWG','OtherFieldsToExclude')
) C
--Where A.DWG='DWG1'
返回
DWG Item Value
DWG1 Part1 0
DWG1 Part2 0
DWG1 Part3 1
DWG1 Part4 2
DWG1 Part5 1
DWG2 Part1 0
DWG2 Part2 0
DWG2 Part3 0
DWG2 Part4 0
DWG2 Part5 1
您正在使用哪些DBMS? mysql <> sql服務器。你能否嘗試清楚地解釋你想要完成的事情?從你張貼的照片來看,對我來說毫無意義。 –
這看起來像您可能想要使用UNPIVOT,但很難理解您真正想要的內容。 –
對不起,SQL Server。該網站只是自動踢它到MySQL。基本上,在行的開始處給出一個值,我想要遍歷整行,並選取大於0的任何值,如果這些值大於0,我需要獲取它們所在的列名。 –