ORACLE行专列统计问题

zhengjianbo4 2010-12-09 10:43:10
1.现有数据
数据一:
字段A 字段B
1 A
2 B
3 C
数据二:
字段C 字段D
1 D
2 E
3 F


现在我需要这样的效果:

字段E 字段F 字段G
A-D A-E A-F
B-D B-E B-F
C-D C-E C-F
说明: 字段最为基行,然后字段B按顺序减去D ,
如果数据二有10行,则结果数据有10列
数据一有多少行,则结果数据就有多少行




...全文
170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhxiao 2010-12-10
  • 打赏
  • 举报
回复
SELECT
MAX(DECODE(RN,1,field1||'-'||field2,NULL)),
MAX(DECODE(RN,2,field1||'-'||field2,NULL)),
MAX(DECODE(RN,3,field1||'-'||field2,NULL)),
FROM
(
SELECT
t1.*,
ROW_NUBMER() OVER(PARTITION BY filed1 ORDER BY field2 ) "RN"
FROM (
SELECT a.b "field1", b.d "field2"
FROM a,b
)t1
)
GROUP BY field1;


如果要动态列的话需要写个存储过程
tangren 2010-12-09
  • 打赏
  • 举报
回复
最后然产生的列不固定,写存储过程动态拼SQL执行就行了。
  • 打赏
  • 举报
回复

--修正下这个
不过相信楼住应该是数字的减法吧
那么修改为
'(decode('||column_col||','''||v1||''','||
value_col'-'column_col||'))'
--应该是
不过相信楼住应该是数字的减法吧
那么修改为
'(decode('||column_col||','''||v1||''','||
value_col||'-'||column_col||'))'
  • 打赏
  • 举报
回复

scott@YPCOST> ed
已写入 file afiedt.buf

1 create table tbb as(
2 select 1 col1, 'D' col2 from dual union all
3 select 2, 'E' from dual union all
4* select 3, 'F' from dual)
scott@YPCOST> /

表已创建。

scott@YPCOST> create table tb as (
2 select 1 col1, 'A' col2 from dual union all
3 select 2, 'B' from dual union all
4 select 3, 'C' from dual)
5 /

表已创建。
scott@YPCOST> ed
已写入 file afiedt.buf

1 create or replace view row_col_view
2 as
3 select tb.col1 id1,tbb.col1 id2,tbb.col2 name2,tb.col2 name1
4* from tb,tbb
scott@YPCOST> /

视图已创建。

scott@YPCOST> select * from row_col_view;

ID1 ID2 N N
---------- ---------- - -
1 1 D A
1 2 E A
1 3 F A
2 1 D B
2 2 E B
2 3 F B
3 1 D C
3 2 E C
3 3 F C

已选择9行。

--创建过程(修改了下狂浪的过程)
/*修改部分
'(decode('||column_col||','''||v1||''','||
value_col||chr(124)||chr(124)||'''-'''||chr(124)||chr(124)||column_col||'))'
上面是形成name2||'-'||name2 这种格式
拼接||还真是一件麻烦事啊

不过相信楼住应该是数字的减法吧
那么修改为
'(decode('||column_col||','''||v1||''','||
value_col'-'column_col||'))'

*/
create or replace procedure row_to_col(tabname in varchar2,
group_col in varchar2,
column_col in varchar2,
value_col in varchar2,
Aggregate_func in varchar2 default 'max',
colorder in varchar2 default null,
roworder in varchar2 default null,
when_value_null in varchar2 default null,
viewname in varchar2 default 'v_tmp')
Authid Current_User
as
sqlstr varchar2(2000):='create or replace view '||viewname||' as select '||group_col||' ';
c1 sys_refcursor;
v1 varchar2(100);
begin
open c1 for 'select distinct '||column_col||' from '||tabname||case when colorder is not null then ' order by '||colorder end;
loop
fetch c1 into v1;
exit when c1%notfound;
sqlstr:=sqlstr||chr(10)||','||case when when_value_null is not null then 'nvl(' end||
Aggregate_func||'(decode('||column_col||','''||v1||''','||
value_col||chr(124)||chr(124)||'''-'''||chr(124)||chr(124)||column_col||'))'||
case when when_value_null is not null then chr(44) ||when_value_null||chr(41) end||'"'||v1||'"';
end loop;
close c1;
sqlstr:=sqlstr||' from '||tabname||' group by '||group_col||case when roworder is not null then ' order by '||roworder end;
execute immediate sqlstr;
end row_to_col;

scott@YPCOST> exec row_to_col('row_col_view','id1','name2','name1');

PL/SQL 过程已成功完成。

scott@YPCOST> select * from v_tmp;

ID1 D E F
---------- --- --- ---
1 A-D A-E A-F
2 B-D B-E B-F
3 C-D C-E C-F
  • 打赏
  • 举报
回复
--如果数据二中的列不多的话可以用语句,要不就要写过程了
with tb as (
select 1 col1, 'A' col2 from dual union all
select 2, 'B' from dual union all
select 3, 'C' from dual),
tbb as(
select 1 col1, 'D' col2 from dual union all
select 2, 'E' from dual union all
select 3, 'F' from dual)
select tb.col1,max(decode(tbb.col2,'D',tb.col2||'-'||tbb.col2)),
max(decode(tbb.col2,'E',tb.col2||'-'||tbb.col2)),
max(decode(tbb.col2,'F',tb.col2||'-'||tbb.col2))
from tb,tbb
group by tb.col1


COL1 MAX MAX MAX
---------- --- --- ---
1 A-D A-E A-F
2 B-D B-E B-F
3 C-D C-E C-F
djvfe 2010-12-09
  • 打赏
  • 举报
回复
不定列的行转列问题,好像有个专门的帖子
心中的彩虹 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhengjianbo4 的回复:]
1.现有数据
数据一:
字段A 字段B
1 A
2 B
3 C
数据二:
字段C 字段D
1 D
2 E
3 F


现在我需要这样的效果:

字段E 字段F 字段G
A-D A-E A-F
B-D B-E B-F
C-D C-E C-F
说明: 字段最为基行,然后字段B按顺序减去D ,
如……
[/Quote]


create or replace procedure p_col(g_col varchar2,c_col varchar2,cur out sys_refcursor)
as
str varchar2(4000);
begin
for i in(select col2 c2 from tb2) loop
str:=str||', max(decode(b.'||c_col||','''||i.c2||''',a.'||g_col||'||''-''||b.'||c_col||')) col'||i.c2;
end loop;
str:='select a.'||g_col||str||' from tb a,tb2 b group by a.'||g_col;
open cur for str;
end;








---运行

SQL> create or replace procedure p_col(g_col varchar2,c_col varchar2,cur out sys_refcursor)
2 as
3 str varchar2(4000);
4 begin
5 for i in(select col2 c2 from tb2) loop
6 str:=str||', max(decode(b.'||c_col||','''||i.c2||''',a.'||g_col||'||''-''||b.'||c_col||')) col'||i.c2;
7 end loop;
8 str:='select a.'||g_col||str||' from tb a,tb2 b group by a.'||g_col;
9 open cur for str;
10 end;
11 /

Procedure created



scott@ORCL> select * from tb
2 /

COL1 C
---------- -
1 A
2 B
3 C

scott@ORCL> select * from tb2
2 /

COL1 C
---------- -
1 D
2 E
3 F

scott@ORCL> var cur refcursor
scott@ORCL> exec p_col('col2','col2',:cur)
scott@ORCL> print cur

C COL COL COL
- --- --- ---
A A-D A-E A-F
B B-D B-E B-F
C C-D C-E C-F









17,089

社区成员

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

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