SQL行列轉換的另一種方法

2021-09-07 08:02:30 字數 1951 閱讀 5455

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)

insert into tb values('王五' , '物理' , 90)

insert into tb values('張六' , '物理' , 100)

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

select 姓名 as 姓名 ,

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

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

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

from tb

group 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) as a

print @sql

set @sql = @sql + ' from tb group by 課程'

exec(@sql) 

godeclare @sql varchar(8000)

set @sql = 'select 姓名 '

select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'

from (select distinct 課程 from tb) as a

set @sql = @sql + ' from tb group by 姓名'

exec(@sql) 

goselect * from tb

go--因為沒有sql 2005的環境,以下未經測試

--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')

行列轉換的另一種形式

在實際做專案的時候遇到這樣乙個問題 資料庫表裡儲存了每個火車站每種型別的火車票銷售數量,但是有的火車站可能不銷售動車票或者高鐵票,最終的結果要如圖2所示,不銷售型別的火車票就空出來。本文採用master.dbo.spt values動態生成最大數目的列頭,然後採用case when實現每種型別的火車...

SQL 擷取的另一種方法

有時候我們需要將如下結果集中的ids進行分割 ids 1,12,123 1 行受影響 希望得到這樣的結果 112 123 3 行受影響 之前一直用表值函式來擷取,這裡借助master.dbo.spt values表來實現 準備資料 if object id tempdb.a is notnull d...

動態XtraReports的另一種方法

昨晚一下忘了,昨天在一籌莫展的情況下,有一位好心 小土豆 遠端協助,實操指導了另外一種動態xtrareports方法。因為是他幫我寫的 我就不貼了。簡單說一下方法思路。在xtrareports資料欄內加入乙個gridcontrol1,將其dock設為fill。然後還是在xtrareports的建構函...