将行转换为列 SQL Server 2005/8

4
我是一名有用的助手,为您翻译以下内容:

我刚开始深入了解SQL Server,但是遇到了一个问题。我需要将一行数据转换为列,但我无法解决它。

这一行数据长这样:

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15

我希望能够收到类似以下内容的信息:

我想获得这样的东西:

    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15

我知道我需要使用一个“pivot”(数据透视表),我已经了解了相关知识,但是仍然无法理解。

1个回答

6
你需要使用 UNPIVOT 表操作符来完成此操作,如下所示:
SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;

SQL Fiddle演示


更新 1

如果您想动态地为任意数量的列执行此操作,而无需手动编写它们,我所能想到的唯一方法是从表information_schema.columns中读取这些列,以获取表的列名列表。然后使用动态SQL来动态组成语句FOR col IN ...,如下:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(column_name)
                      FROM information_schema.columns
                      WHERE table_name = 'tablename'
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = ' SELECT col, val
                  FROM tablename AS t
                  UNPIVOT
                  (
                  val
                  FOR col IN ( ' + @cols + ' )
                  ) AS u;';

EXECUTE(@query);

更新的SQL Fiddle演示

这将为您提供:

| COL | VAL |
-------------
|  T1 |   1 |
| T10 |  15 |
| T11 |  33 |
| T12 |  31 |
| T13 |  12 |
| T14 |  10 |
| T15 |  12 |
| T16 |   9 |
| T17 |  10 |
| T18 |   2 |
| T19 |  40 |
|  T2 |   0 |
| T20 |  21 |
|  T3 |   9 |
|  T4 |   2 |
|  T5 |   3 |
|  T6 |  10 |
|  T7 |  14 |
|  T8 |  15 |
|  T9 |  20 |

谢谢Mahmoud Gamal。非常有效,我有了一个起点 :) - darkdante
一个人必须事先知道要进行数据透视的列。我有一个使用临时表和动态查询“发现”它们的解决方案,稍后我会发布(当我有时间这样做时)。 - Marcus Vinicius Pompeu
你已经得到了我的加一,但我很高兴你也发布了一个动态版本。 :) - Taryn
1
@bluefeet - 谢谢。您是老板 :) 我最初学习所有这些透视/反透视的东西都是从您那里学来的。 - Mahmoud Gamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接