【題目】
下面是表名為cook的表
要求查詢結果如下:
【解題思路】
電影《女男變錯身》中是男女互換身份
這個題其實也是“互換身份”,叫做行列互換問題,就是将一維表轉化為二維表。
1.輸出行列互換的表結構
可以看出,需要輸出的有5列,其中隻有“年”這一列是表cook中原有的,其他4列(也就是2-5列:m1對應的是1月份、m2對應的是2月份、m3對應的是3月份、m4對應的是4月份)需要自己建立。
select 年,m1,m2,m3,m4
from cook;
可以看出查詢結果和目标表的列名結構一樣,但是2-5列(m1、m2、m3、m4)的值不是題目要求的:
- 如何将2-5列的值替換成對應的值?
可以用case語句進行條件判斷來替換。
年份和月份比對,則為對應值,不比對則為0。
select 年,
(case 月 when '1' then 值 else 0 end) as m1,
(case 月 when '2' then 值 else 0 end) as m2,
(case 月 when '3' then 值 else 0 end) as m3,
(case 月 when '4' then 值 else 0 end) as m4
max(case 月 when '1' then 值 else 0 end) as 'm1',
max(case 月 when '2' then 值 else 0 end) as 'm2',
max(case 月 when '3' then 值 else 0 end) as 'm3',
max(case 月 when '4' then 值 else 0 end) as 'm4'
from cook
group by 年;
這個sql的運作過程如下:
這樣我們就得到了目标表(行列互換)。
【本題考點】
1.考查用case語句進行資料替換,和條件判斷
2.遇到行列互換的問題,可以用下面的萬能模版來解決。
select A,
-- 第2步,在行列互換結果表中,其他列裡的值分别使用case和max來擷取
max(case B when 'm' then C else 0 end) as 'm',
max(case B when 'n' then C else 0 end) as 'n'
-- 第1步,在行列互換結果表中按第1列分組
group by A;
【舉一反三】
下面是學生的成績表(表名:成績表,列名:學号,課程,成績)
使用sql語句實作将該表行轉化為下面的表結構:
參考答案:
select 學号,
max(case 課程 when '國文' then 成績 else 0 end) as 國文成績,
max(case 課程 when '數學' then 成績 else 0 end) as 數學成績
from 成績表
group by 學号;
輸出結果:
推薦:如何從零學會sql?