Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将行转换为列SQL Server 2005/8_Sql_Sql Server_Pivot_Unpivot - Fatal编程技术网

将行转换为列SQL Server 2005/8

将行转换为列SQL Server 2005/8,sql,sql-server,pivot,unpivot,Sql,Sql Server,Pivot,Unpivot,我刚刚开始深入了解SQL Server,我遇到了一个问题。我必须把一行转换成一列,但我想不出来 该行如下所示: Columns: T1 T2 T3 .........T20 Values: 1 0 9 ......... 15 Col Val ________ T1 1 T2 0 T3 9 ........ T20 15 SELECT col, val FROM Table

我刚刚开始深入了解SQL Server,我遇到了一个问题。我必须把一行转换成一列,但我想不出来

该行如下所示:

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15
    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15
SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;
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);
我想收到这样的东西:

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15
    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15
SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;
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);
我知道我必须使用枢轴,我已经读过这方面的内容,但我想不出它是什么

您必须使用表运算符来实现这一点,如下所示:

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15
    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15
SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;
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);


更新1 如果您想对任意数量的列动态执行此操作,而不需要手动写入,我唯一能想到的方法是从表
信息\u schema.columns
中读取这些列,以获取表的列名称列表。然后使用动态SQL动态地为col IN…编写语句,如下所示:

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15
    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15
SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;
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);
这将为您提供:

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

谢谢马哈茂德·贾马尔。工作起来很有魅力,我有一个开始:)人们必须事先知道要旋转的柱子。我有一个使用临时表和动态查询“发现”它们的解决方案,今天晚些时候我会发布(当我有时间这样做的时候)。我已经给了你+1,但我很高兴你也发布了一个动态版本。:)@蓝脚-谢谢。你是老板:)我刚从你那里学到了所有这些pivot/unpivot的东西。