请教一个非固定行列转换sql的写法.

tjm1 2006-01-05 11:59:24
有一个表:员工卖出商品明细表(aaa)

员工 商品 卖出数量
-----------------------
张 显示器 1
张 鼠标 5
张 光驱 1
李 键盘 3
赵 显示器 3
...

要求统计出的报表如下:

员工 显示器 键盘 鼠标 光驱
-------------------------------
张 1 5 1
李 3
赵 3

其中的商品名称不是固定的,以后有可能增加,所以不能用固定的几个decode语句来写。
请问这种列不固定的怎么实现?
...全文
120 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
子陌红尘 2006-01-05
  • 打赏
  • 举报
回复
楼主看错了最后一段查询处理,execute语句生成了一个新表tt,交叉表查询结果保存在该表中:
----------------------------------------------------------------------------------------------------------------------------------------------
--执行
select * from tt;
tjm1 2006-01-05
  • 打赏
  • 举报
回复
楼上:
SQL> create table aa(emp varchar2(20),sp varchar2(20),sl numeric(5,0));

表已创建。

SQL> insert into aa values('张','显示器',1);

已创建 1 行。

SQL> insert into aa values('张','鼠标 ',5);

已创建 1 行。

SQL> insert into aa values('张','光驱 ',1);

已创建 1 行。

SQL> insert into aa values('李','键盘 ',3);

已创建 1 行。

SQL> insert into aa values('赵','显示器',3);

已创建 1 行。

SQL> declare col1 aa.sp%type; --定义类型
2 sqlstr varchar2(8000);
3 cursor c_try is select distinct sp from aa;
4 begin
5 sqlstr:='';
6 open c_try;
7 loop
8 fetch c_try into col1;
9 exit when c_try%notfound;
10 sqlstr:=sqlstr||', sum(decode(sp,'''||col1||''',sl,0)) as '||col1;
11 exit when c_try%notfound;
12 end loop;
13 close c_try;
14 sqlstr:='create table tt as select emp'||sqlstr||' from aa group by em
15 --tt为刚创建的一个保存结果的表
16 execute immediate sqlstr;
17 end;
18
19 /

PL/SQL 过程已成功完成。

SQL> select * from aa;

EMP SP SL
-------------------- -------------------- ----------
张 显示器 1
张 鼠标 5
张 光驱 1
李 键盘 3
赵 显示器 3
子陌红尘 2006-01-05
  • 打赏
  • 举报
回复
create table T(员工 varchar2(20),商品 varchar2(20),卖出数量 numeric(5,0))
insert into T values('张','显示器',1)
insert into T values('张','鼠标 ',5)
insert into T values('张','光驱 ',1)
insert into T values('李','键盘 ',3)
insert into T values('赵','显示器',3)



declare col1 T.商品%type; --定义类型
sqlstr varchar2(8000);
cursor c_try is select distinct 商品 from T;
begin
sqlstr:='';
open c_try;
loop
fetch c_try into col1;
exit when c_try%notfound;
sqlstr:=sqlstr||', sum(decode(商品,'''||col1||''',卖出数量,0)) as '||col1;
exit when c_try%notfound;
end loop;
close c_try;
sqlstr:='create table tt as select 员工'||sqlstr||' from T group by 员工';
--tt为刚创建的一个保存结果的表
execute immediate sqlstr;
end;

--执行
select * from tt;


/*
员工 显示器 键盘 鼠标 光驱
----- ------ ---- ---- ----
张 1 0 5 1
李 0 3 0 0
赵 3 0 0 0
*/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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