sql实现行列转换,sql实现行列
| 姓名 | 科目 | 成绩 |
| 牛芬 | 语文 | 81 |
| 牛芬 | 数学 | 88 |
| 牛芬 | 英语 | 84 |
| 张三 | 语文 | 90 |
| 张三 | 数学 | 98 |
| 张三 | 英语 | 90 |
(表一)
现有一个表如(表一)
| 姓名 | 语文 | 数学 | 英语 |
| 牛芬 | 81 | 88 | 84 |
| 张三 | 90 | 98 | 90 |
想要转换为(表二)
sql:select stuName as 姓名,chinese as 语文,math as 数学,english as 英文 from(
select sutName,
case subject when chinese then score end as chinese,
case subject when math then score end as math,
case subject when english then score end as english
from table) as tmp
group by stuName
若要把(表二)转换成(表一)
postgresql里面有个unnest函数可以使用:
select stuName,unnest(array['chinese','math','english']) as subject,unnest(array[chinest,math,englist]) as score from table group by stuName
就这么简单
第一种:
select [姓名]=max([姓名]), 数学=sum(case when [课程]='数学' then [分数] else 0 end),物理=sum(case when [课程]='物理' then [分数] else 0 end),英语=sum(case when [课程]='英语' then [分数] else 0 end),语文=sum(case when [课程]='语文' then [分数] else 0 end) from tb group by [姓名]
第二种:
declare @sql varchar(8000)
set @sql = ''
select @sql = @sql+[课程]+'=sum(case when [课程]='''+[课程]+''' then [分数] else 0 end),' from (SELECT DISTINCT [课程] FROM TB) A
set @sql = left(@sql,len(@sql) - 1)
set @sql = 'select [姓名]=max([姓名]), '+@sql+' from tb group by [姓名] '
exec (@sql)
你的这种变化貌似是毫无意义的,或许 你想要的变换时下面的这种情况吧。
******原来的纵表tb*****
学号 科目 成绩
1001 语文 90
1001 数学 80
1001 英语 70
1002 语文 95
1002 数学 85
1002 英语 75
*****目标的横表*****
学号 语文 数学 英语 总分
1001 90 80 70 240
1002 95 85 75 255
sql语句:
select 学号 as '学号',
sum(case 科目 when '语文' then 成绩 else 0 end) as '语文',
sum(case 科目 when '数学' then 成绩 else 0 end) as '数学',
sum(case 科目 when '英语' then 成绩 else 0 end) as '英语',
sum(case when 科目!='' then 成绩 end) as '总分'
from tb
group by 学号