SQL 没有计算的服务器旋转
SQL Server Pivoting without calculation
我想旋转 table,我试过自连接,但速度很慢。请帮助我做 this.Below 是我的 table 结构。
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 做这个吗?
请注意结果集中,由于 space 限制
,我更改了字段名称
提前致谢。
我可以得到如下的行吗?
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
此查询将 return 持续三个学期。如果您需要更多,请添加额外的列并更改 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;
我想旋转 table,我试过自连接,但速度很慢。请帮助我做 this.Below 是我的 table 结构。
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 做这个吗?
请注意结果集中,由于 space 限制
,我更改了字段名称提前致谢。
我可以得到如下的行吗?
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
此查询将 return 持续三个学期。如果您需要更多,请添加额外的列并更改 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;