根据行值拉列

时间:2013-06-04 10:02:31

标签: sql sql-server-2005

我有一张桌子X

ID      A       B       C        D
1       T       T       F        T
2       F       T       F        T
3       T       F       T        F

因此,如果我的输入为1表示ID,那么我希望所有列名称的值都为第1行。在上述情况A,B,D或如果ID为3,则为A和C.

我如何列出这些列?

3 个答案:

答案 0 :(得分:3)

您可以将UNPIVOT用于此

SELECT Y
FROM Table1
UNPIVOT (X FOR Y IN ([A], [B], [C], [D])) U
WHERE [ID] = 1 AND X = 'T'

返回

+---+
| Y |
+---+
| A |
| B |
| D |
+---+

SQL Fiddle

答案 1 :(得分:1)

此外,您可以将XQuery与强大的FLWOR Expression结合使用。并且无论有多少列包含表;)

SELECT(
       SELECT *     
       FROM Table1 t
       WHERE ID = 1 
       FOR XML PATH(''), TYPE
       ).query(
               'for $spec in ./*
                where $spec [contains(., "T")]           
                return fn:local-name($spec)'
                ) o

SQLFiddle上的演示

此决定返回每行的列名

SELECT o.TCols.value('.', 'nvarchar(100)') AS T 
FROM(SELECT(
            SELECT *     
            FROM Table1 t
            WHERE ID = 1
            FOR XML PATH(''), TYPE
            ).query('
                     for $spec in ./*
                     where $spec [contains(., "T")]           
                     return (
                             <TCols>
                               {fn:local-name($spec)}
                             </TCols>
                             )
                     ')) t(TCols) CROSS APPLY T.TCols.nodes('/TCols') o(TCols)

结果

+---+
| T |
+---+
| A |
| B |
| D |
+---+

SQLFiddle上的演示

答案 2 :(得分:0)

如果您知道所有列的编号和名称,可以执行以下操作

SELECT case A when 'T' then 'A' else '' end
  + case B when 'T' then ',B' else '' end
+ case C when 'T' then ',C' else '' end
+ case D when 'T' then ',D' else '' end
FROM
 Table1
WHERE ID = 1