sql實現行列轉換,sql實現行列

來源:互聯網
上載者:User

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 學號
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.