SQL查询结果列转行(转)

本文介绍如何使用SQL将查询结果中的行转换为列,包括CASE WHEN语句和自动生成SQL语句的方法。提供了详细的示例,如从包含产品销售数据的表中按月份汇总各产品的销售额。
SQL查询结果列转行
2008-06-19 13:14

数据库-行转列的语法

                                      

 

 

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值