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)

你可能感兴趣的:(sql,查询语句,行转列)