[英]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.