数据库-行转列的语法

来源:互联网 发布:CR1000程序编程 编辑:程序博客网 时间:2024/05/16 04:48

表: 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;



*****************************************************
可以自动生成的语句(摘录中国DOtNet)
 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)
******************************************************

历史数据

declare @sql varchar(8000)
set @sql = 'select dt,qcode'
select @sql = @sql + ',sum(case [pid] when '''+cast([pid] as nvarchar)+''' then [val] end) as [' + cast(pid AS nvarchar) + ']'
from (select distinct pid from T20060411_60min WHERE PID IN(1,2,3,7,8,9,15,20)) as a
select @sql = @sql+' from T20060411_60min group by dt,qcode'
print @sql
exec(@sql)

********************************************************************************************************

写出这个SQL语句!

create table student
(
stuNo int,
stuName varchar(20) 
);

create table cg
(
stuNo   int,
course   varchar(20),
result int
);

alter table cg add constraint foreign key (stuNo) references student(stuNo);

insert into student values(1,'a');
insert into student values(2,'b');

insert into cg values(1,'english',50);
insert into cg values(1,'chinese',60);

insert into cg values(2,'english',57);
insert into cg values(2,'chinese',68);

/ lect * from student
stuNo stuName
1    aa
2    bb

/ lect * from cg
stuNo course   result
1 Chinese    80
1 English    92
2 Chinese    75
2 English    86

//只是随便写的两个表,通过stuNo关联,上面那个表是主表,下面的是引用表
//大概意思就这样,
//要求显示效果如下:
stuNo stuName Englist   Chinese total
1 aa    80    92   172  
1 bb    75    86   161


星域锁定<sunnysin@126.com> 21:07:56
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';

==================================================================

select sum(decode(sj1,'A', 1,0)) "A",
    sum(decode(sj1,'B', 1,0)) "B",
    sum(decode(sj1,'C', 1,0)) "C",
    sum(decode(sj1,'D', 1,0)) "D",
    sum(decode(sj1,'E', 1,0)) "E",
    from TABLE

=================================================================

姓名 课程 分数

---- ---- ----
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94 

结果:

姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)


--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中也适用,本人验证过.//////////////////////////

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
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 SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b


--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')



转自:http://blog.sina.com.cn/s/blog_5f8d04170100qkfv.html