我们在应用中通常会遇到需要行转列的情况。
比如一个成绩表。表通常会这样设计:
学生号 科目 成绩
01 语文 80
01 英语 90
02 语文 60
........................
然后可能客户需要的是这样的信息呈现:
学生号 语文 英语 数学 ....
01 80 90
02 60
.......................................
这种情况我们就会需要行转列。
使用case when来依条件分列是最简单的一种方法。
- select 学生号,
- sum(case 科目 when '语文' then 成绩 end) as 语文,
- sum(case 科目 when '数学' then 成绩 end) as 数学,
- ......
- from table
- where ...
- group by 学生号
然后当这种条件分支不清晰,转换后列数不固定的情况下呢?对照上面的例子来说就是,假设我并不知道学生学了哪些科目的时候应该怎么做?
我们继续用case when,但是由于列的不固定,需要先根据条件分支产生的可能性来拼接一下语句再动态执行。直接上码看效果可能更清晰一点:
- declare @sql varchar(4000)
- set @sql = 'select 学生号'
- select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目+']'
- from (select distinct 科目 from table ) as a
- order by 科目
- select @sql = @sql+' from table group by 学生号'
- --print @sql
- exec(@sql)