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