简体   繁体   English

在T-SQL中将列值转置为行

[英]Transpose Column Value to Row in T-SQL

I know this might have been asked before but I really could not find the answer. 我知道以前可能会问过这个问题,但我确实找不到答案。 I have a temporary table named #TEMP which looks like this: 我有一个名为#TEMP的临时表,看起来像这样:

+===============================+=============================+
| NAME                          | ATTRIBUTE                   |
+===============================+=============================+                                  
| BadgeType                     | Permanent                   |
+-------------------------------+-----------------------------+
| PrimaryLocationInCompany      | No                          |
+-------------------------------+-----------------------------+
| AdminAccessToProductionServer | No                          |
+-------------------------------+-----------------------------+
| AccessToImportantFIles        | No                          |
+-------------------------------+-----------------------------+
| Waiver_Number                 | 56987                       |
+-------------------------------+-----------------------------+
| Summary                       | User not much active        |
+-------------------------------+-----------------------------+
| TimeStamp                     | 3/3/2009                    |
+-------------------------------+-----------------------------+
| UserID                        | 86478925                    |
+-------------------------------+-----------------------------+

What I want to do is to transpose both the Name and Attribute values to rows. 我要做的是将“ Name和“ Attribute值都转换为行。 The Attribute values may vary but the Name values are always fixed. Attribute值可能会有所不同,但Name值始终是固定的。

The result should look like this: 结果应如下所示:

+----------+---------------+------------------------------+--------------------------------+-----------------------+--------------------------------------------------------+----------+-----------+
| UserID   | BadgeType     | PrimaryLocationIntelFacility | adminAccessToProductionServer  | AccessToClassifiedData| Info_Sec_Waiver_Number                                 | Summary  | TimeStamp |
+----------+---------------+------------------------------+--------------------------------+-----------------------+--------------------------------------------------------+----------+-----------+
| 11313403 | GREEN         | No                           | No                             | No                    | This contingent worker is eligible for remote access.  | 3/3/2009 |           |
+----------+---------------+------------------------------+--------------------------------+-----------------------+--------------------------------------------------------+----------+-----------+

Try this 尝试这个

SELECT UserID,BadgeType,PrimaryLocationInCompany,AdminAccessToProductionServer,AccessToImportantFIles,WaiverNumber,Summary,[TimeStamp]
FROM
(
    SELECT * FROM #Temp
) p
PIVOT
(
    MIN([ATTRIBUTE]) FOR [NAME] IN(BadgeType,PrimaryLocationInCompany,AdminAccessToProductionServer,AccessToImportantFIles,WaiverNumber,Summary,[TimeStamp],UserID)
) T

Also check the below for dynamic columns 还要检查以下动态列

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

select @cols = STUFF((SELECT ',' + [NAME]
                    from #Temp
                    group by [NAME]
            FOR XML PATH('')) 
        ,1,1,'')

set @query = 'SELECT  ' + @cols + ' from 
             (
                select * from #Temp
            ) x
            pivot 
            (
                MAX([ATTRIBUTE])
                for [NAME] in (' + @cols + ')
            ) p '

execute(@query)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM