SQL 服务器枢轴 2014

SQL SERVER PIVOT 2014

我有以下查询 returns 下面的输出。

 SELECT 
        SYUSER.FieldValue, DICT.Descrip, SYUSER.syStudentID,
        ROW_NUMBER() OVER (PARTITION BY SYUSER.syStudentID ORDER BY SYUSER.syStudentID) AS RowNum
    FROM 
        SyUserValues(NOLOCK) SYUSER
        INNER JOIN SyUserDict DICT ON SYUSER.syUserDictID = DICT.syUserDictID
    WHERE 
        SYUSER.syUserDictID IN (46,53,54,55,56,57,58,59,60,61,62,63,64,65,74,89,90,91,92,93)

输出

+-------------+--------------------------+-------------+--------+
| FieldValue  |         Descrip          | syStudentID | RowNum |
+-------------+--------------------------+-------------+--------+
| 1           | ClnUsmleStep1EverApplied |        1243 |      1 |
| 1           | ClnUsmleStep1MaxAttempt  |        1243 |      2 |
| 235         | ClnUsmleStep1Best        |        1243 |      3 |
| 8/5/2009    | ClnUsmleStep1Date        |        1243 |      4 |
| 1           | ClnUsmleStep1Passed      |        1243 |      5 |
| 1           | ClnUsmleCKMaxAttempt     |        1243 |      6 |
| 233         | ClnUsmleCKBest           |        1243 |      7 |
| 6/4/2011    | ClnUsmleCKDate           |        1243 |      8 |
| 1           | ClnUsmleCKPassed         |        1243 |      9 |
| 1           | ClnUsmleCSMaxAttempt     |        1243 |     10 |
| P           | ClnUsmleCSBest           |        1243 |     11 |
| 1/22/2011   | ClnUsmleCSDate           |        1243 |     12 |
| 1           | ClnUsmleCSPassed         |        1243 |     13 |
| 7865975     | UsmleID                  |        1243 |     14 |
| S0000086640 | UsmleRefCode             |        1243 |     15 |
| 3/29/2011   | UsmleCertDate            |        1243 |     16 |
| 1/25/2012   | UsmleCertTranscriptDate  |        1243 |     17 |
| 1/27/2012   | UsmleTranscriptRcvdDate  |        1243 |     18 |
| 1           | ClnUsmleStep1EverApplied |        1249 |      1 |
| 1           | ClnUsmleStep1MaxAttempt  |        1249 |      2 |
| 201         | ClnUsmleStep1Best        |        1249 |      3 |
| 6/29/2013   | ClnUsmleStep1Date        |        1249 |      4 |
| 1           | ClnUsmleStep1Passed      |        1249 |      5 |
| 1           | ClnUsmleCKMaxAttempt     |        1249 |      6 |
| 219         | ClnUsmleCKBest           |        1249 |      7 |
| 11/23/2016  | ClnUsmleCKDate           |        1249 |      8 |
| 1           | ClnUsmleCKPassed         |        1249 |      9 |
| 2           | ClnUsmleCSMaxAttempt     |        1249 |     10 |
| P           | ClnUsmleCSBest           |        1249 |     11 |
| 3/16/2017   | ClnUsmleCSDate           |        1249 |     12 |
+-------------+--------------------------+-------------+--------+

我想使用 Pivot 来实现列为行和行为列。我的输出应该是这样的。

ClnUsmleCertificationDate   ClnUsmleStep1EverApplied    ClnUsmleStep1MaxAttempt ClnUsmleStep1Best   ClnUsmleStep1Date   ClnUsmleStep1Passed ClnUsmleCKMaxAttempt    ClnUsmleCKBest  ClnUsmleCKDate  ClnUsmleCKPassed    ClnUsmleCSMaxAttempt    ClnUsmleCSBest  ClnUsmleCSDate  ClnUsmleCSPassed    StudentUSMLEConsentRelease  UsmleID UsmleRefCode    UsmleCertDate   UsmleCertTranscriptDate UsmleTranscriptRcvdDate

FieldValue 应作为每个列中的值出现。

我无法做到这一点。请帮助我。

谢谢

这是一个基于您的数据的数据透视操作示例。您可以开始处理它并将其集成到您的查询中。

为了便于测试,我创建了一个 table 变量来保存您的数据。

--declare table variable with test data
declare @tmp table(FieldValue nvarchar(100), Descrip nvarchar(100), syStudentID int, RowNum int)

insert into @tmp select '1'          ,'ClnUsmleStep1EverApplied',1243,  1 
insert into @tmp select '1'          ,'ClnUsmleStep1MaxAttempt' ,1243,  2 
insert into @tmp select '235'        ,'ClnUsmleStep1Best'       ,1243,  3 
insert into @tmp select '8/5/2009'   ,'ClnUsmleStep1Date'       ,1243,  4 
insert into @tmp select '1'          ,'ClnUsmleStep1Passed'     ,1243,  5 
insert into @tmp select '1'          ,'ClnUsmleCKMaxAttempt'    ,1243,  6 
insert into @tmp select '233'        ,'ClnUsmleCKBest'          ,1243,  7 
insert into @tmp select '6/4/2011'   ,'ClnUsmleCKDate'          ,1243,  8 
insert into @tmp select '1'          ,'ClnUsmleCKPassed'        ,1243,  9 
insert into @tmp select '1'          ,'ClnUsmleCSMaxAttempt'    ,1243, 10 
insert into @tmp select 'P'          ,'ClnUsmleCSBest'          ,1243, 11 
insert into @tmp select '1/22/2011'  ,'ClnUsmleCSDate'          ,1243, 12 
insert into @tmp select '1'          ,'ClnUsmleCSPassed'        ,1243, 13 
insert into @tmp select '7865975'    ,'UsmleID'                 ,1243, 14 
insert into @tmp select 'S0000086640','UsmleRefCode'            ,1243, 15 
insert into @tmp select '3/29/2011'  ,'UsmleCertDate'           ,1243, 16 
insert into @tmp select '1/25/2012'  ,'UsmleCertTranscriptDate' ,1243, 17 
insert into @tmp select '1/27/2012'  ,'UsmleTranscriptRcvdDate' ,1243, 18 
insert into @tmp select '1'          ,'ClnUsmleStep1EverApplied',1249,  1 
insert into @tmp select '1'          ,'ClnUsmleStep1MaxAttempt' ,1249,  2 
insert into @tmp select '201'        ,'ClnUsmleStep1Best'       ,1249,  3 
insert into @tmp select '6/29/2013'  ,'ClnUsmleStep1Date'       ,1249,  4 
insert into @tmp select '1'          ,'ClnUsmleStep1Passed'     ,1249,  5 
insert into @tmp select '1'          ,'ClnUsmleCKMaxAttempt'    ,1249,  6 
insert into @tmp select '219'        ,'ClnUsmleCKBest'          ,1249,  7 
insert into @tmp select '11/23/2016' ,'ClnUsmleCKDate'          ,1249,  8 
insert into @tmp select '1'          ,'ClnUsmleCKPassed'        ,1249,  9 
insert into @tmp select '2'          ,'ClnUsmleCSMaxAttempt'    ,1249, 10 
insert into @tmp select 'P'          ,'ClnUsmleCSBest'          ,1249, 11 
insert into @tmp select '3/16/2017'  ,'ClnUsmleCSDate'          ,1249, 12 

这是使用 table 变量的数据透视命令:

--pivot data on [Descrip] column
select * from(
    select FieldValue
    ,Descrip 
    ,syStudentID  
    from @tmp
) src
pivot
(
    max(FieldValue)
    for Descrip in (
        [ClnUsmleCKBest], 
        [ClnUsmleCKDate], 
        [ClnUsmleCKMaxAttempt],
        [ClnUsmleCKPassed],
        [ClnUsmleCSBest],
        [ClnUsmleCSDate],
        [ClnUsmleCSMaxAttempt],
        [ClnUsmleCSPassed],
        [ClnUsmleStep1Best],
        [ClnUsmleStep1Date],
        [ClnUsmleStep1EverApplied],
        [ClnUsmleStep1MaxAttempt],
        [ClnUsmleStep1Passed],
        [UsmleCertDate],
        [UsmleCertTranscriptDate],
        [UsmleID],
        [UsmleRefCode],
        [UsmleTranscriptRcvdDate]
    )
) piv

这是这个命令的结果(因为有很多列我在几列之后截屏):

请注意,在旋转的 table 中,您将有一些 null 值,因为并非所有列都存在(例如 ClnUsmleCSPassed 仅存在于 syStudentID = 1243)