現有三個數據表,分別是學生表,課程表,成績表。它們的結構與樣例數據如下:
學生
表:
xno???????? xname
1???????????? 小王
2????????????? 小黑
課程
表:
kno???????? kname
1?????????????語文
2???????????? 數學
成績表
:
cno?????????ckno??????????????cf
1??????????????? 1????????????????86.5
1?????????????? 2???????????????? 98.86
2???????????????1???????????????? 86.7
2???????????????2???????????????? 86.9
?
(??
xno? int ?,
?xname? varchar ( 20 )?
)
go ?
insert ? into ?dbo.學生表?
select ? 1 , ' 小王 '
union ? all ?
select ? 2 , ' 小黑 ' ?
create ? table ?課程表
(
kno? int ?,
kname? varchar ( 20 )
)
go
insert ? into ?課程表
select ? 1 , ' 語文 '
union ? all
select ? 2 , ' 數學 '
create ? table ?成績表
(
cno? int ,
ckno? int ,
cf? float
)
alter ? table ?成績表
alter ? column ?cf?
insert ? into ?成績表
select ? 1 , 1 , 86.5
insert ? into ?成績表
select ? 1 , 2 , 98.86
union ? all
select ? 2 , 1 , 86.7
union ? all
select ? 2 , 2 , 86.9
select ? * ? from ?學生表
select ? * ? from ?課程表
select ? * ? from ?成績表
現要求在一行中輸出每個學生的所有課程的成績單,顯示樣例格式如下:
姓名??????? 語文??????? 數學??????
小王??????? 60??????????? 70??????????
小黑??????? 80??????????? 65??????????
?
當大家看到這樣的題目時會優先考慮到的是怎樣的一條SQL語句呢?嵌套Select?對,在將行轉換為列時,也許這種方法是最優先考慮到
?
( SELECT ?cf? FROM ?成績表? INNER ? JOIN ?課程表? ON ?成績表.ckno = 課程表.kno? WHERE ?成績表.cno = B.xno? AND ?課程表.kname = ' 語文 ' ?)? AS ?語文,
( SELECT ?cf? FROM ?成績表? INNER ? JOIN ?課程表? ON ?成績表.ckno = 課程表.kno? WHERE ?成績表.cno = B.xno? AND ?課程表.kname = ' 數學 ' ?)? AS ?數學
FROM ?學生表?B
?
這樣我們的目的是達到了,但后來我又想了一下,因為我們要的數據其實都在 成績表 里,只不過現有的是用行來存放,那我們怎么將它轉換為列顯示呢?嗯,這也許就要搬出聚合函數加Case條件來處理了!最終的SQL語句如下:
MAX ( CASE ?kname? WHEN ? ' 語文 ' ? THEN ?cf? ELSE ? 0 ? END )? AS ?語文,
MAX ( CASE ?kname? WHEN ? ' 數學 ' ? THEN ?cf? ELSE ? 0 ? END )? AS ?數學
FROM ?( SELECT ?B.xname,C.kname,D.cf? FROM ?成績表?D?
INNER ? JOIN ?學生表?B? ON ?B.xno = D.cno?
INNER ? JOIN ?課程表?C? ON ?C.kno = D.ckno)? AS ?ZH? GROUP ? BY ?xname
?
運行后,也是可以得到正確的數據,下面給出測試代碼,大家可以直接在SQL查詢分析器里運行
方法一:
( SELECT ?cf? FROM ?成績表? INNER ? JOIN ?課程表? ON ?成績表.ckno = 課程表.kno? WHERE ?成績表.cno = B.xno? AND ?課程表.kname = ' 語文 ' ?)? AS ?語文,
( SELECT ?cf? FROM ?成績表? INNER ? JOIN ?課程表? ON ?成績表.ckno = 課程表.kno? WHERE ?成績表.cno = B.xno? AND ?課程表.kname = ' 數學 ' ?)? AS ?數學
FROM ?學生表?B
?
方法二:
MAX ( CASE ?kname? WHEN ? ' 語文 ' ? THEN ?cf? ELSE ? 0 ? END )? AS ?語文,
MAX ( CASE ?kname? WHEN ? ' 數學 ' ? THEN ?cf? ELSE ? 0 ? END )? AS ?數學
FROM ?( SELECT ?B.xname,C.kname,D.cf? FROM ?成績表?D?
INNER ? JOIN ?學生表?B? ON ?B.xno = D.cno?
INNER ? JOIN ?課程表?C? ON ?C.kno = D.ckno)? AS ?ZH? GROUP ? BY ?xname
DROP
TABLE
學生表
DROP
TABLE
課程表
DROP
TABLE
成績表
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
