根据列值

时间:2018-04-15 22:49:32

标签: python sql sql-server excel pivot

如何根据每条记录的列值返回列名和值?

我有这个: I have this

我想更新

first_color,颜色名称具有最高值

具有最高值的first_value,依此类推,如下面的代码段所示。

注意:这只是一个例子,我有100多个列,我需要列名称&前5列/值的值。所以,如果可能的话,寻找动态的SQL。

I want this

到目前为止,我使用交叉申请。

enter image description here

2 个答案:

答案 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