有3張表:
學生表:s
字段:學生編號 學生姓名
課程表:c
字段:課程編號 課程名稱
成績表:sc
字段:學生編號 課程編號 分數
需要實現最終效果如下:
(後面有些課程省略沒有截圖了)
實現的方法:
方法一:
select
max(s.
[name])
as姓名,
max(
case
when
sc.cid='
1'then
sc.score
end)
asenglish,
max(
case
when
sc.cid='
2'then
sc.score
end)
aschinese,
max(
case
when
sc.cid='
3'then
sc.score
end)
ashistory
--...當然這裡可以有多少個的話以此類推,但是sc.cid 的值一定要和c表中的課程id一致,且別名也要和課程名稱一致
from
sc,s
where
sc.sid
=s.id
group
bysc.sid
go優點:這種方法有點傻瓜式,意思簡單明瞭。
缺點:都是固定死的,如果需求一變動,就需要改**。
方法二:
declare
@sql
varchar
(8000
)set
@sql=''
select
@sql
=@sql+'
,max(case when sc.cid=
'''+
convert
(varchar
,sc.cid)
+'''
then sc.score end) ['+
convert
(varchar
,c.[
name])
+']'
from
sc,c
where
sc.cid
=c.id
group
bysc.cid,c.
[name
]set
@sql
=stuff
(@sql,1
,1,''
@sql
exec('
select max(s.[name]) as [name],'+
@sql+'
from sc,s where sc.sid = s.id group by sc.sid')
執行結果:
這裡我們發現chemistry的成績沒有?原因是成績單裡面沒有chemistry的成績記錄。
這樣就實現了乙個動態的報表查詢。
報表統計 sql面試題
有3張表 學生表 s 字段 學生編號 學生姓名 課程表 c 字段 課程編號 課程名稱 成績表 sc 字段 學生編號 課程編號 分數 需要實現最終效果如下 後面有些課程省略沒有截圖了 實現的方法 方法一 select max s.name as姓名,max case when sc.cid 1 the...
sql 分組統計 面試題
兩道sql面試題,那人把試卷給我後居然坐在對面盯著看,我承認我受不了這個,愣死沒答出來。他很鄙視我物件導向的四大特性只聽說過三個,汗 回來後幾分鐘搞定,不一定是最好的,但能應付筆試題。1.表test結構 group score a 勝 b 負 a 負 b 勝 檢索結果 組 勝 負 a 1 1 b 1...
分組統計 SQL面試題
一道sql面試題,題目很簡單。年份 工資 2000 1000 2001 2000 2002 3000 2003 4000 這裡有乙份公司表,一句sql查詢出下列結果 年份 工資 2000 1000 2001 3000 2002 6000 2003 10000 author dba 小七 set no...