經典SQL行列转换

經典SQL行列转换

問題: 假设有张学生成绩表(Test)如下
       Name Subject Result
       张三 语文 80
       张三 数学 90
       张三 物理 85
       李四 语文 85
       李四 数学 92
       李四 物理 82
 
結果:
       姓名 语文 数学 物理
       张三 80 90 85
       李四 85 92 82

DROP TABLE Test
create table Test(Name varchar(10),Subject Varchar(10),Result int)
insert Test
select '張三','語文',80 union all
select '張三','數學',90 union all
select '張三','物理',85 union all
select '李四','語文',85 union all
select '李四','數學',92 union all
select '李四','物理',82
go

SELECT * FROM Test
 
--用於多行的轉換
declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
from (select distinct Subject from test) as a
select @sql = @sql+' from test group by name'
       exec(@sql)

--如果行數少這個看起來更加明瞭
select Name as 姓名,
 sum(case Subject when '數學' then Result end) [數學],
 sum(case Subject when '物理' then Result end) [物理],
 sum(case Subject when '語文' then Result end) [語文]
from Test group by name

我以前面試的時候考試過這種類似的題,也是我們在編程開發過程中經常遇到的一種常見題,我的分析希望對大家有幫助。


 

你可能感兴趣的:(經典SQL行列转换)