菜鸟妹妹问 关于 数据表 行列转换 显示

greenwaterandice 2006-01-11 10:45:47
我搜索了以往的帖子,发现以下方法是我需要的,就请问
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
这段话是放在什么地方执行的?我在sql plus 里面执行不过去,请大虾指教。谢谢诸位了!

方法如下:

纵转换为横。
有表:test(name char(10),km char(10),cj int)
name km cj
----------------------------------------------
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78

要求以横向格式显示,即:
想变成

姓名 语文 数学 英语
----------------------------
张三 80 86 75
李四 78 85 78

Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)
方法:
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
子陌红尘 2006-01-11
  • 打赏
  • 举报
回复
楼主查到的是SQL Server里动态行转列处理的代码,在Oracle里用这一段:
----------------------------------------------------------------------------------------------------------------------------
create table test (name varchar2(10),km varchar2(10),cj numeric);
insert test values('张三','语文',80);
insert test values('张三','数学',86);
insert test values('张三','英语',75);
insert test values('李四','语文',78);
insert test values('李四','数学',85);
insert test values('李四','英语',78);

--测试
declare col1 test.km%type; --定义类型
sqlstr varchar2(8000);
cursor c_try is select distinct km from test;
begin
sqlstr:='';
open c_try;
loop
fetch c_try into col1;
exit when c_try%notfound;
sqlstr:=sqlstr||', max(decode(km,'''||col1||''',cj,0)) as '||col1;
exit when c_try%notfound;
end loop;
close c_try;
sqlstr:='create table tt as select 姓名'||sqlstr||' from test group by 姓名';
--tt为刚创建的一个保存结果的表
execute immediate sqlstr;
end;

--执行
select * from tt;
greenwaterandice 2006-01-11
  • 打赏
  • 举报
回复
非常感谢 libin_ftsafe(子陌红尘) ,现在就结贴给分

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧