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