Reputation: 105
I want to pivot a table, I tried self-join but it is very slow. kindly help me to do this.Below is my table structure.
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
I want to pivot this like below
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
Can I do this with Pivot?
Kindly note in the resultset, I changed the field name due to space limitation
Thanks in advance.
Can I get the rows like below?
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
Upvotes: 1
Views: 96
Reputation: 1787
Take last three terms, based on ENRL_TERM_SEQ
for respective students and pull required columns.
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;
Upvotes: 1
Reputation: 4146
This query will return last three terms. If you need more add extra columns and change rn
value:
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
Upvotes: 1