經典SQL問題 行轉列《轉》

2022-09-16 00:48:10 字數 4534 閱讀 5313

) 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(casecoursewhen'語文'thenscoreend)as'語文',

sum(casecoursewhen'數學'thenscoreend)as'數學',

sum(casecoursewhen'英語'thenscoreend)as'英語'

fromgradegroupbyname

方法三: ?1

2345

6789

1011

1213

1415

1617

1819

2021

2223

2425

26delimiter &&

createproceduresp_count()

begin

#課程名稱

declarecourse_nvarchar(20);

#所有課程數量

declarecountint;

#計數器

declareiintdefault0;

#拼接sql字串

set@s ='select name';

setcount= (selectcount(distinctcourse)fromgrade);

while i <countdo

setcourse_n = (selectcoursefromgrade limit i,1);

set@s = concat(@s,', sum(case  course when  ','\'', course_n,'\'',' then score end )',' as ','\'',course_n,'\'');

seti = i+1;

endwhile;

set@s = concat(@s,' from grade group by name');

#用於除錯

#select@s;

preparestmtfrom@s;

executestmt;

end

&&

call sp_count();

方法分析:

第一種方法使用了表連線。

第二種使用了分組,對每個分組分別處理。

第三種使用了儲存過程,其實是第二種方法的動態化,先計算出所有課程的數量,然後對每個分組進行課程查詢。

很明顯前兩種方法屬於硬編碼,增加課程後就需要修改sql。而第三種則沒有這種問題。

note:

mysql中不能在乙個儲存過程中刪除另乙個儲存過程,只能呼叫另乙個儲存過程

本來想在方法三裡面寫上:drop procedure if exists sp_count();這是錯誤的。除錯的時候如果寫錯了,只能手動刪除了,也沒找到好方法。

參考資料:

2013-8-8更新:

方法二還可以使用if語句。

如下所示: ?1

2345

selectname,

sum(if (course ='語文', score ,null) )as'語文',

sum(if (course ='數學', score ,null) )as'數學',

sum(if (course ='英語', score ,null) )as'英語 '

fromgradegroupbyname

經典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...