如何根据每条记录的列值返回列名和值?
我想更新
first_color,颜色名称具有最高值
具有最高值的first_value,依此类推,如下面的代码段所示。
注意:这只是一个例子,我有100多个列,我需要列名称&前5列/值的值。所以,如果可能的话,寻找动态的SQL。
到目前为止,我使用交叉申请。
答案 0 :(得分:2)
SQL Server方法
也许与CROW APPLY一起使用ROW_NUMBER()
示例强>
Select A.*
,B.*
from YourTable2 A
Cross Apply (Select First_Color = max(case when RN=1 then Item end)
,First_Value = max(case when RN=1 then Value end)
,Second_Color = max(case when RN=2 then Item end)
,Second_Value = max(case when RN=2 then Value end)
From (Select *,RN=Row_Number() over (Order by Value Desc)
From ( values ('Red',Red)
,('Green',Green)
,('Blue',Blue)
,('Black',Black)
) B1 (Item,Value)
) B2
) B
<强>返回强>
unique_id Red Green Blue Black First_Color First_Value Second_Color Second_Value
abc12 1 2 4 7 Black 7 Blue 4
mnc23 2 4 1 3 Green 4 Black 3
答案 1 :(得分:1)
使用新信息,这将取消您的数据,而不必动态。如果需要,你可以PIVOT
Select A.unique_id
,C.*
,ColNr = Row_Number() over (Partition By unique_id Order by Value Desc)
From YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Field = a.value('local-name(.)','varchar(100)')
,Value = a.value('.','varchar(max)')
From B.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./@*') as C2(a)
Where a.value('local-name(.)','varchar(100)') not in ('unique_id')
) C
返回
unique_id Field Value ColNr
abc12 Black 7 1
abc12 Blue 4 2
abc12 Green 2 3
abc12 Red 1 4
mnc23 Green 4 1
mnc23 Black 3 2
mnc23 Red 2 3
mnc23 Blue 1 4