簡體   English   中英

SQL Server無需計算的數據透視

[英]SQL Server Pivoting without calculation

我想旋轉一個表,我嘗試了自連接,但是速度很慢。 請幫助我做到這一點。下面是我的表結構。

STUDENT_ID   AC_YEAR    AC_TERM     STANDING      ENRL_TERM_SEQ 
10001         2015       SPRING        NULL           1          
10001         2015       FALL          NULL           2          
10001         2016       SPRING         W             3          
10001         2016       FALL           W             4          
10002         2015       SPRING        NULL           1          
10002         2015       FALL           W             2          
10002         2016       SPRING        NULL           3          
10002         2016       FALL          NULL           4          
10005         2015       SPRING        NULL           1          
10005         2015       FALL          NULL           2         
10005         2016       SPRING        NULL           3          
10005         2016       SUMMER        NULL           4          
10005         2016       FALL          NULL           5  

我想像下面這樣旋轉

ST_ID  CUR_YR  CUR_TM CUR_SD  PR1_YR  PR1_TM  PR1_SD  PR2_YR PR_TM  PR2_SD
10001  2016    FALL    W      2016    SPRING    W     2015    FALL   NULL
10002  2016    FALL   NULL    2016    SPRING   NULL   2015    FALL    W 
10005  2016    FALL   NULL    2016    SUMMER   NULL   2016   SPRING  NULL

我可以使用Pivot做到這一點嗎?

請注意結果集中,由於空間限制,我更改了字段名稱

提前致謝。

我可以得到下面的行嗎?

ST_ID  CUR_YR  CUR_TM CUR_SD  PR1_YR  PR1_TM  PR1_SD  PR2_YR PR_TM  PR2_SD 
10001  2015    SPRING   NULL   NULL   NULL    NULL    NULL   NULL    NULL
10001  2015    FALL     NULL   2015   SPRING  NULL    NULL   NULL    NULL
10001  2016    SPRING    W     2015   FALL    NULL    2015   SPRING  NULL
10001  2016    FALL      W     2016   SPRING   W      2015   FALL    NULL
10002  2015    SPRING   NULL   NULL   NULL    NULL    NULL   NULL    NULL
10002  2015    FALL      W     2015   SPRING  NULL    NULL   NULL    NULL
10002  2016    SPRING   NULL   2015   FALL     W      2015   SPRING  NULL
10002  2016    FALL     NULL   2016   SPRING  NULL    2015   FALL     W
10005  2015    SPRING   NULL   NULL   NULL    NULL    NULL   NULL    NULL
10005  2015    FALL     NULL   2015   SPRING  NULL    NULL   NULL    NULL
10005  2016    SPRING   NULL   2015   FALL    NULL    2015   SPRING  NULL
10005  2016    SUMMER   NULL   2016   SPRING  NULL    2015   FALL    NULL
10005  2016    FALL     NULL   2016   SUMMER  NULL    2016   SPRING  NULL

該查詢將返回最后三個詞。 如果需要更多,請添加額外的列並更改rn值:

select
    STUDENT_ID
    , max(case when rn = 1 then AC_YEAR end), max(case when rn = 1 then AC_TERM end), max(case when rn = 1 then STANDING end)
    , max(case when rn = 2 then AC_YEAR end), max(case when rn = 2 then AC_TERM end), max(case when rn = 2 then STANDING end)
    , max(case when rn = 3 then AC_YEAR end), max(case when rn = 3 then AC_TERM end), max(case when rn = 3 then STANDING end)
from (
    select
        *, row_number() over (partition by STUDENT_ID order by AC_YEAR desc, case AC_TERM when 'FALL' then 1 when 'SUMMER' then 2 when 'SPRING' then 3 end) rn
    from
        myTable
) t
where
    rn <= 3
group by STUDENT_ID

根據ENRL_TERM_SEQ為每個學生選擇最后三個學期,並拉入必填列。

SELECT A.STUDENT_ID,

MAX(CASE WHEN A.TERM = 1 THEN A.AC_YEAR END) AS CUR_YR,
MAX(CASE WHEN A.TERM = 1 THEN A.AC_TERM END) AS CUR_TM,
MAX(CASE WHEN A.TERM = 1 THEN A.STANDING END) AS CUR_SD,

MAX(CASE WHEN A.TERM = 2 THEN A.AC_YEAR END) AS PR1_YR,
MAX(CASE WHEN A.TERM = 2 THEN A.AC_TERM END) AS PR1_TM,
MAX(CASE WHEN A.TERM = 2 THEN A.STANDING END) AS PR1_SD,

MAX(CASE WHEN A.TERM = 3 THEN A.AC_YEAR END) AS PR2_YR,
MAX(CASE WHEN A.TERM = 3 THEN A.AC_TERM END) AS PR2_YM,
MAX(CASE WHEN A.TERM = 3 THEN A.STANDING END) AS PR2_SD

FROM

(SELECT *, DENSE_RANK() OVER (PARTITION BY STUDENT_ID ORDER BY ENRL_TERM_SEQ DESC) AS TERM FROM YOUR_TABLE) A

GROUP BY A.STUDENT_ID
ORDER BY A.STUDENT_ID;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM