T-SQL 中的列到行

Posted

技术标签:

【中文标题】T-SQL 中的列到行【英文标题】:Columns to Rows in T-SQL 【发布时间】:2020-07-24 10:10:24 【问题描述】:

我有表 tbl_Survey:

      SurveyID 1  2  3  4

            7  4  4  4  4
            8  3  3  3  3
            9  2  2  2  2

我的目标是将表头 - 1 2 3 4 转换为行,如下所示:

enter 
      SurveyID  Ouestion Rating

             7        1       4
             7        2       4
             7        3       4
             7        4       4
             8        1       3
             8        2       3
             8        3       3
             8        4       3
             9        1       2
             9        2       2
             9        3       2
             9        4       2

我的代码是(尝试遵循帮助建议):

     SELECT [SurveyID]
           ,[Question]
           ,[Rating]
  
     FROM 
         [tbl_Survey]
         cross apply
                   (
                    values
                          ('1', 1 ),
                          ('2', 2 ),
                          ('3', 3 ),
                          ('4', 4 )
                   ) c (Question, Rating);

     

结果不完全正确(评分栏有问题):

         SurveyID  Ouestion Rating

             7        1       1
             7        2       2
             7        3       3
             7        4       4
             8        1       1
             8        2       2
             8        3       3
             8        4       4
             9        1       1
             9        2       2
             9        3       3
             9        4       4

     

请帮忙...

我的问题(因为我无法继续)是我的代码没有使用括号。

这是更新后的代码:

          SELECT [SurveyID], [Question], [Rating]

          FROM [dbo].[tbl_Survey]

              UNPIVOT
              (
               [Rating]
                
                FOR [Question] in ([1], [2], [3], [4])
               
               ) AS SurveyUnpivot
   

【问题讨论】:

这能回答你的问题吗? Unpivot with column name @Larnu 按照这些说明,我的代码卡住了……再试一次,几分钟后会发帖 【参考方案1】:

这个怎么样:

DECLARE @T TABLE (SurveyID int, q1 int, q2 int,  q3 int, q4 int) 
INSERT @T (SurveyID, q1, q2, q3, q4) 
VALUES (7,4,4,4,4), (8,3,3,3,3), (9, 2, 2, 2, 2)

SELECT SurveyID, REPLACE(Question,'q','') as Question, Rating 
FROM @T UNPIVOT (Rating FOR Question in (q1, q2, q3, q4)) as UPV

【讨论】:

这可以工作,以及我新更新的代码(我将更新主帖)。但是我面临着新问题的挑战——我需要能够完成这项工作——即使我的 1 2 3 4 标题将被更改为其他任何内容。如果不是 1 2 3 4 我会有类似 hi1 hi2 hi3 hi4 之类的东西。所以我需要这个的动态版本...【参考方案2】:

同样的方法。只要确保您使用全局临时表,因为临时表在 EXEC 语句的范围内是不可见的。这应该适用于任何列名和任意数量的列。

IF OBJECT_ID('tempdb..##T') IS NOT NULL DROP TABLE ##T
CREATE TABLE ##T (SurveyID int, xxxxx int, yyyyy int, zzzzzz int, tttttt int) 
INSERT ##T VALUES (7,4,4,4,4), (8,3,3,3,3), (9, 2, 2, 2, 2)

DECLARE @Colnames nvarchar(4000)
SELECT @Colnames = STUFF((SELECT ',[' + [name] +']' FROM tempdb.sys.columns where object_id = object_id('tempdb..##T') AND name <> 'SurveyID' FOR XML PATH('') ),1,1,'')

DECLARE @SQL nvarchar(4000)  SET @SQL = 'SELECT SurveyID, Question, Rating FROM ##T UNPIVOT (Rating FOR Question in ('+@colnames+')) as UPV'
EXEC(@SQL) 

【讨论】:

以上是关于T-SQL 中的列到行的主要内容,如果未能解决你的问题,请参考以下文章

具有不同日期的列到行

如何获得解码/未透视行的唯一计数(列到行)

用分号查询列到单独的行中[重复]

多列,多表列到行 unpivot

没有 UNPIVOT 的 Oracle SQL 列到行

python pandas,某些列到行[重复]