SQL 行列轉換

2021-08-25 11:39:54 字數 3428 閱讀 2587

參考自:

表scores

請轉成的橫表是這樣子的:

答案;

select 姓名,

sum(case 課程 when '語文' then 分數 else 0 end) as 語文,

sum(case 課程 when '數學' then 分數 else 0 end) as 數學,

sum(case 課程 when '物理' then 分數 else 0 end) as 物理

from scores group by 姓名

既然這個表只有兩列,那麼可以根據姓名進行分組。先把姓名拼湊出來,後面的分數我們再想辦法。

select 姓名 from scores group by 姓名
結果:

分析:我們先拿到語文這個科目的分數。既然我們用到了group by 語句,這裡肯定要用聚合函式來求分數。

而且我們只需要語文這一科的成績,分組出來的 一共有 3列 ,分別是 語文、數學、物理  。  那麼就需要判斷科目來取分數。

這裡符合我們需求的 case 語句就登場了。它和c#中switch-case 作用一樣。

sql case 語句語法:

case 字段

when 值1 then 結果

when 值2 then 結果2

...else 預設結果

end

select 姓名,sum(case 課程 when  '語文' then 分數 else 0 end) as 語文 from scores group by 姓名
結果:

既然語文的分數取到了,其他科目改變下條件就可以了。

完整的sql:

select 姓名,

sum(case 課程 when '語文' then 分數 else 0 end) as 語文,

sum(case 課程 when '數學' then 分數 else 0 end) as 數學,

sum(case 課程 when '物理' then 分數 else 0 end) as 物理

from scores group by 姓名

我們先把剛剛轉好的表,插入乙個新錶scores2中。

select 姓名,

sum(case 課程 when '語文' then 分數 else 0 end) as 語文,

sum(case 課程 when '數學' then 分數 else 0 end) as 數學,

sum(case 課程 when '物理' then 分數 else 0 end) as 物理

into scores2

from scores group by 姓名

我們也先把張三和李四的語文成績查出來。

select 姓名,

'語文' as 課程,

語文 as 分數

from scores2

結果:

還有兩科的資料怎麼辦呢? 很簡單,我們乙個個都查出來,然後用 union all 把他們組合為一張表就可以了。

select 姓名,

'語文' as 課程,

語文 as 分數

from scores2

union all

select 姓名,

'數學' as 課程,

數學 as 分數

from scores2

union all

select 姓名,

'物理' as 課程,

物理 as 分數

from scores2

order by 姓名 desc

結果:

但是大家有沒有覺得很麻煩呢?別急,我們有更簡單的辦法。下面為大家介紹pivot關係運算子。

pivot是sql server 2005 提供的運算子,所以只要資料庫在05版本以上的都可以使用。主要用於行和列的轉換。

select

t2.姓名,

t2.數學,

t2.物理,

t2.語文

from scores as t1

pivot (sum(分數) for 課程 in(數學,語文,物理)) as t2

pivot將原來表中 課程欄位中的 資料行 數學,語文,物理 轉換為列,並用sum取對應列的值。我們只需要記住它的用法就可以了。

select

*from

scores2

unpivot (分數 for 課程 in (語文,數學,物理)) as t3

unpivot 將 語文,數學,物理 列轉為行,分數為新的一列存放對應的值。我們還可以使用decode函式

答案亦可:

if:

select student,

sum(if(subject='語文',score,0 )) as 語文,

sum(if(subject='數學',score,0 )) as 數學,

sum(if(subject='英語',score,0 )) as 英語

from scores group by student ;

pivot:

(含id要去掉id)

select *

from (select "year","month","amount" from "test4")

pivot (

sum("amount")

for "month"

in (1 m1,2 as m2,3 as m3) );

(不含id)

select *

from "student"

pivot (

sum("score")

for "subject"

in ("語文" as 語文,"數學"as 數學,"英語" as 英語) );

sql行列轉換

問題 如果上述兩表互相換一下 即表結構和資料為 姓名 語文 數學 物理 張三 74 83 93 李四 74 84 94 想變成 得到如下結果 姓名 課程 分數 李四 語文 74 李四 數學 84 李四 物理 94 張三 語文 74 張三 數學 83 張三 物理 93 create table tb ...

SQL 行列轉換

資料列轉換成行。其中一列需要轉換成行,因為列的值不確定所以用動態執行sql sql物件拼寫出要轉換行的列的值。declare sql varchar 1000 select sql isnull sql advertise name from tbl advertise master select ...

sql行列轉換

1 靜態的行轉列 sql select start dt,max case type name when 總的參與人數 then value end as 總的參與人數 max case type name when 會員參與人數 then value end as 會員參與人數 max case ...