欢迎投稿

今日深度:

sql实现行列转换,sql实现行列

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

就这么简单


SQL行列转换

第一种:
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)
 

急: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 学号
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4240.html NewsArticle sql实现行列转换,sql实现行列 姓名 科目 成绩 牛芬 语文 81 牛芬 数学 88 牛芬 英语 84 张三 语文 90 张三 数学 98 张三 英语 90 (表一) 现有一个表如(表一) 姓名 语文 数学 英语 牛芬...
评论暂时关闭