根据列值返回 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

SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改

SQL:将列值链接到列名以满足某些条件

如何根据列值SQL Server扩展表[重复]

根据列值动态获取列名

根据现有的列名和列值在 python 数据框中创建列