1. 程式人生 > >SQL查詢結果列轉行

SQL查詢結果列轉行

資料庫-行轉列的語法
1.表: PerTab
欄位:name,  title,  values
原內容:一月  產品A   120
    二月  產品A   20
    一月  產品B    230
    二月  產品B   400
-----------------------------------------------
查詢結果: 月份  產品A  產品B  數量(Values)
      一月  120   230
      二月  20   400
-----------------------------------------------
SQl語法:
select name, sum(case title when '產品A' then values else 0 end ) as 產品A  from PerTab group by name 


備註: 其中中間的可以重複,得到所有的列
還可以用這樣的SQL語句:

select p1.name,sum(p1.values) as 產品 A,sum(p2.values) as 產品B from pertab p1,pertab p2 where p1.name=p2.name and p1.ti
tle='產品A' and p2.title='產品B' group by name;

可以自動生成的語句:

declare @sql varchar(8000)
 set @sql = 'select name'
 select @sql = @sql + ',sum(case title when '''+title+''' then values end) ['+title+']'
  from (select distinct title from PerTab) as a
 select @sql = @sql+' from PerTabgroup by name'
 exec(@sql)

示例二:
stuNo stuName
1   aa
2    bb

stuNo course result
1   Chinese 80
1   English 92
2   Chinese 75
2   English 86
要求顯示如下:
stuNo stuName Englist Chinese total
1    aa   80    92   172
1    bb  75    86  161

select s.stuno as stuNo, s.stuName as stuName,
c1.result as english, c2.result as chinese,
(c1.result+c2.result) as total from
cg c1 inner join cg c2 on c1.stuno=c2.stuno inner
join student s on c1.stuno=s.stuno where
c1.course='english' and c2.course='chinese';


示例三:
姓名 課程 分數
---- ---- ----
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
結果:
姓名 語文 數學 物理
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
--SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程

select 姓名 as 姓名 ,
max(case 課程 when '語文' then 分數 else 0 end) 語文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '物理' then 分數 else 0 end) 物理
from tb
group by 姓名

////上面這條查詢語句在DB2中也適用,本人驗證過.//////////////////////////


declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)