根据列值返回 SQL Server 列名和对应值
Posted
技术标签:
【中文标题】根据列值返回 SQL Server 列名和对应值【英文标题】:Return SQL Server column name and corresponding value based on column value 【发布时间】:2018-04-15 22:49:32 【问题描述】:如何根据每条记录的列值返回列名和值?
我有这个:
我想更新
first_color 具有最高值的颜色名称
first_value 以此类推,如下面的sn-p。
注意:这只是一个示例,我有 100 多个列,我需要前 5 个列/值的列名和值。所以,如果可能的话,寻找一个动态的sql。
我已经到了这一点,使用交叉应用。
【问题讨论】:
【参考方案1】:SQL Server 方法
也许与 ROW_NUMBER() 一起使用 CROSS APPLY
示例
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
【讨论】:
谢谢。我忘了提到我有超过 100 列我想获取列名和值。我在示例中缩小了它的大小。【参考方案2】:有了新信息,这将取消透视您的数据,而无需进行动态处理。如果需要,您可以然后 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
【讨论】:
以上是关于根据列值返回 SQL Server 列名和对应值的主要内容,如果未能解决你的问题,请参考以下文章
Pivot Rows to Columns 考虑到列名和值列 SQL