SQL基礎用法 行列轉換

2021-07-03 18:42:13 字數 2440 閱讀 9056



說明:普通行列轉換(version

1.0)僅針對sql server 2000提供靜態和動態寫法,version

2.0增加sql server 2005的有關寫法。

--------------

問題:假設有張學生成績表(tb)如下:

姓名 課程 分數

張三 語文

74張三 數學

83張三 物理

93李四 語文

74李四 數學

84李四 物理

94想變成(得到如下結果):

姓名 語文 數學 物理

-- ---- ---- ----

李四 74

8494

張三 74

8393

-------------------

*/create

table

tb(姓名

varchar(10

) , 課程

varchar(10

) , 分數

int)

insert

into

tb values('

張三', '

語文', 74

)insert

into

tb values('

張三', '

數學', 83

)insert

into

tb values('

張三', '

物理', 93

)insert

into

tb values('

李四', '

語文', 74

)insert

into

tb values('

李四', '

數學', 84

)insert

into

tb values('

李四', '

物理', 94)go

--sql server 2000 靜態sql,指課程只有語文、數學、物理這三門課程。(以下同)

select

姓名 as

姓名 ,

max(

case

課程 when'語文

'then

分數 else

0end

) 語文,

max(

case

課程 when'數學

'then

分數 else

0end

) 數學,

max(

case

課程 when'物理

'then

分數 else

0end

) 物理

from

tbgroup

by姓名

--sql server 2000 動態sql,指課程不止語文、數學、物理這三門課程。(以下同)

declare

@sql

varchar

(8000

)set

@sql='

select 姓名

'select

@sql

=@sql+'

, max(case 課程 when

'''+

課程 +

'''then 分數 else 0 end) ['+

課程 +']

'from

(select

distinct

課程 from

tb) asa

set@sql

=@sql+'

from tb group by 姓名

'exec

(@sql

) --

sql server 2005 靜態sql。

select

*from

(select

*from

tb) a pivot (

max(分數)

for課程

in(語文,數學,物理)) b

--sql server 2005 動態sql。

declare

@sql

varchar

(8000

)select

@sql

=isnull

(@sql+'

],['

, '') +

課程 from

tb group

by課程

set@sql='

['+@sql+'

]'exec('

select * from (select * from tb) a pivot (max(分數) for 課程 in ('+

@sql+'

)) b')

---------------------------------

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