標籤:style color io 資料 art ar size sql
Student表有三列,分別是姓名、課程、成績
Name Curricula Mark
張三 語文 70
李四 數學 80
王朝 英語 59
城南 馬哲 70
王朝 語文 90
我想得到的效果是,列出各個學科及格的人名:
語文 化學 數學
張三 李四
王朝
學科不止3門,可能有八門怎麼弄呢?其實這就是典型的維度方向變化.
準備資料:
create table stgrade(Name varchar(10), Curricula varchar(10) , Mark int);
go
insert into stgrade values(‘張三‘ , ‘語文‘,‘70‘ );
insert into stgrade values(‘李四‘ , ‘數學‘,‘80‘);
insert into stgrade values(‘王朝‘ , ‘英語‘,‘59‘);
insert into stgrade values(‘城南‘ , ‘馬哲‘,‘70‘ );
insert into stgrade values(‘王朝‘ , ‘語文‘,‘90‘ );
go
select * from stgrade;
NameCurriculaMark
張三語文70
李四數學80
王朝英語59
城南馬哲70
王朝語文90
用case when 來實現根據column的值來返回同一行別的column的值,因為我們這裡不需要分數,只關心Curricula 和name,所以是在分數賽選過後,進行一個case when操作.
select
case when Curricula=‘語文‘ then name end 語文,
case when Curricula=‘數學‘ then name end 數學,
case when Curricula=‘英語‘ then name end 英語,
case when Curricula=‘馬哲‘ then name end 馬哲
from stgrade where mark>59
語文 數學 英語 馬哲
張三NULLNULLNULL
NULL李四NULLNULL
NULLNULLNULL城南
王朝NULLNULLNULL
又上面已經可以看到結果集合已經初具雛形了,要是更讓每個column下的NULL消失,然後後面行的值補上來就能達到我們的要求了。
select
case when Curricula=‘語文‘ then name end 語文,
case when Curricula=‘數學‘ then name end 數學,
case when Curricula=‘英語‘ then name end 英語,
case when Curricula=‘馬哲‘ then name end 馬哲,
sn
from
(
select curricula,name,mark,
row_number() over(partition by curricula order by name) sn
from stgrade where mark>59
) t
語文數學英語馬哲sn
NULLNULLNULL城南1
NULL李四NULLNULL1
王朝NULLNULLNULL1
張三NULLNULLNULL2
select sn,
max(case when Curricula=‘語文‘ then name end) 語文,
max(case when Curricula=‘數學‘ then name end) 數學,
max(case when Curricula=‘英語‘ then name end) 英語,
max(case when Curricula=‘馬哲‘ then name end) 馬哲
from
(
select curricula,name,mark,
row_number() over(partition by curricula order by name) sn
from stgrade where mark>59
) t
group by sn
sn語文數學英語馬哲
1王朝李四NULL城南
2張三NULLNULLNULL