) 20人收藏此文章, 我要收藏 贊0
學校裡面記錄成績,每個人的選課不一樣,而且以後會新增課程,所以不需要把所有課程當作列。資料庫grade裡面資料如下圖,假定每個人姓名都不一樣,作為主鍵。本文以mysql為基礎,其他資料庫會有些許語法不同。
資料庫資料:
處理後效果:
下面介紹三種方法:
方法一: ?1
2345
selectdistinct a.
name
,
(selectscorefromgrade bwherea.
name
=b.nameandb.course=
'語文'
)
as
'語文'
,
(selectscorefromgrade bwherea.
name
=b.nameandb.course=
'數學'
)
as
'數學'
,
(selectscorefromgrade bwherea.
name
=b.nameandb.course=
'英語'
)
as
'英語'
fromgrade a
方法二: ?1
2345
selectname,
sum
(
case
coursewhen
'語文'
thenscoreend)
as
'語文'
,
sum
(
case
coursewhen
'數學'
thenscoreend)
as
'數學'
,
sum
(
case
coursewhen
'英語'
thenscoreend)
as
'英語'
fromgradegroupbyname
方法三: ?1
2345
6789
1011
1213
1415
1617
1819
2021
2223
2425
26delimiter &&
create
procedure
sp_count()
begin
#課程名稱
declare
course_n
varchar
(20);
#所有課程數量
declare
count
int
;
#計數器
declare
i
int
default
0;
#拼接sql字串
set
@s =
'select name'
;
set
count
= (
select
count
(
distinct
course)
from
grade);
while i <
count
do
set
course_n = (
select
course
from
grade limit i,1);
set
@s = concat(@s,
', sum(case course when '
,
'\''
, course_n,
'\''
,
' then score end )'
,
' as '
,
'\''
,course_n,
'\''
);
set
i = i+1;
end
while;
set
@s = concat(@s,
' from grade group by name'
);
#用於除錯
#
select
@s;
prepare
stmt
from
@s;
execute
stmt;
end
&&
call sp_count();
方法分析:
第一種方法使用了表連線。
第二種使用了分組,對每個分組分別處理。
第三種使用了儲存過程,其實是第二種方法的動態化,先計算出所有課程的數量,然後對每個分組進行課程查詢。
很明顯前兩種方法屬於硬編碼,增加課程後就需要修改sql。而第三種則沒有這種問題。
note:
mysql中不能在乙個儲存過程中刪除另乙個儲存過程,只能呼叫另乙個儲存過程
本來想在方法三裡面寫上:drop procedure if exists sp_count();這是錯誤的。除錯的時候如果寫錯了,只能手動刪除了,也沒找到好方法。
參考資料:
2013-8-8更新:
方法二還可以使用if語句。
如下所示: ?1
2345
select
name
,
sum
(if (course =
'語文'
, score ,
null
) )
as
'語文'
,
sum
(if (course =
'數學'
, score ,
null
) )
as
'數學'
,
sum
(if (course =
'英語'
, score ,
null
) )
as
'英語 '
from
grade
group
by
name
經典SQL問題 行轉列,列轉行
情景簡介 學校裡面記錄成績,每個人的選課不一樣,而且以後會新增課程,所以不需要把所有課程當作列。資料庫grade裡面資料如下圖,假定每個人姓名都不一樣,作為主鍵。本文以mysql為基礎,其他資料庫會有些許語法不同。資料庫資料 mysql select from grade id name cours...
sql 行轉列問題
題目 下表tproduct某產品在各城市各月銷量情況 city name month no 月 qut qty 臺 杭州 9 100 杭州 10 120 上海 9 130 上海 10 140 請寫sql實現 如下查詢 city 9月銷量 10月銷量 杭州 100 120 上海 130 140 答案一...
sql行轉列問題
mysql sql語句 行轉列問題 存在表score,記錄學生的考試成績,如下圖所示 現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示 具體步驟如下 1 首先,使用case when函式輸出單個課程的成績 case when course 語文 then score end a...