天天看點

行列互換問題,怎麼辦?送你一個萬能模版

【題目】

下面是表名為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)的值不是題目要求的:

  1. 如何将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?