Return 记录中最大值所在的列名

Return column names based on which holds the maximum value in the record

我有一个 table 具有以下结构...

+--------+------+------+------+------+------+
| ID     | colA | colB | colC | colD | colE | [...] etc.
+--------+------+------+------+------+------+
| 100100 | 15   | 100  | 90   | 80   | 10   | 
+--------+------+------+------+------+------+
| 100200 | 10   | 80   | 90   | 100  | 10   | 
+--------+------+------+------+------+------+
| 100300 | 100  | 90   | 10   | 10   | 80   | 
+--------+------+------+------+------+------+

我需要 return 列名称的串联值,每行最多包含 3 个值 ...

+--------+----------------------------------+
| ID     | maxCols                          |
+--------+----------------------------------+
| 100100 | colB,colC,colD                   |
+--------+------+------+------+------+------+
| 100200 | colD,colC,colB                   | 
+--------+------+------+------+------+------+
| 100300 | colA,colB,colE                   | 
+--------+------+------+------+------+------+

这里有一个技巧可以使用 Cross ApplyTable Valued Constructor

SELECT Id,
       maxCols= Stuff(cs.maxCols, 1, 1, '')
FROM   Yourtable
       CROSS apply(SELECT(SELECT TOP 3 ',' + NAME
                          FROM   (VALUES (colA,'colA'),(colB,'colB'),(colC,'colC'),
                                         (colD,'colD'),(colE,'colE')) tc (val, NAME)
                          ORDER  BY val DESC
                          FOR xml path, type).value('.[1]', 'nvarchar(max)')) cs (maxCols) 

如果需要,可以使用 Information_schema.Columns

使其动态化

您可以使用 UNPIVOT 并为每个 ID 获得前 3 名

;with temp AS
(
    SELECT ID, ColValue, ColName
    FROM @SampleData sd
    UNPIVOT
    (
       ColValue For ColName in ([colA], [colB], [colC], [colD], [colE])
    ) unp
)
SELECT sd.ID, ca.ColMax
FROM @SampleData sd
CROSS APPLY
(
    SELECT STUFF(
              (
                SELECT TOP 3 WITH TIES
                       ',' + t.ColName
                FROM temp t
                WHERE t.ID = sd.ID
                ORDER BY t.ColValue DESC
                FOR XML PATH('')
              )
             ,1,1,'') AS ColMax
) ca

在此处查看演示:http://rextester.com/CZCPU51785