之前发过一个帖子,叫行转列的通用过程,http://topic.csdn.net/u/20091019/11/67cd55a3-3f42-4db7-a3f8-91dd52a913cd.html能满足最基本的需求。但也有一些缺陷,现在对其进行完善
代码
1.使用视图SQL codecreate 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(to_char('||column_col||'),'''||v1||''','||value_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;
这里修改了传入参数名,使其更容易理解。继续使用了创建视图这个方法,当然也可以改成用游标传出。
参数:
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。
举例:
SQL code--测试数据
create table rowtocol_test as
select 2009 year,1 month,'部门1' dept,50000 expenditure from dual
union all select 2009,2,'部门1',20000 from dual
union all select 2009,2,'部门1',30000 from dual
union all select 2010,1,'部门1',35000 from dual
union all select 2009,2,'部门2',40000 from dual
union all select 2009,3,'部门2',25000 from dual
union all select 2010,2,'部门3',60000 from dual
union all select 2009,2,'部门3',15000 from dual
union all select 2009,2,'部门3',10000 from dual;
我现在想根据year和month分组,将部门转成列。
SQL codeSQL> select * from rowtocol_test;
YEAR MONTH DEPT EXPENDITURE
---------- ---------- ----- -----------
2009 1 部门1 50000
2009 2 部门1 20000
2009 2 部门1 30000
2010 1 部门1 35000
2009 2 部门2 40000
2009 3 部门2 25000
2010 2 部门3 60000
2009 2 部门3 15000
2009 2 部门3 10000
9 rows selected
SQL> execute row_to_col('rowtocol_test','year,month','dept','expenditure');
PL/SQL procedure successfully completed
SQL> select * from v_tmp;
YEAR MONTH 部门1 部门3 部门2
---------- ---------- ---------- ---------- ----------
2009 1 50000
2010 1 35000
2009 3 25000
2009 2 30000 15000 40000
2010 2 60000
SQL>
这个结果可能不是我们想要的,重新调用过程,使用几个可选参数
SQL codeSQL> execute row_to_col('rowtocol_test','year,month','dept','expenditure',Aggregate_func => 'sum',colorder => 'dept',roworder => '1,2',when_value_null => '0');
PL/SQL procedure successfully completed
SQL> select * from v_tmp;
YEAR MONTH 部门1 部门2 部门3
---------- ---------- ---------- ---------- ----------
2009 1 50000 0 0
2009 2 50000 40000 25000
2009 3 0 25000 0
2010 1 35000 0 0
2010 2 0 0 60000
SQL>
进行行转列的也可以是视图
SQL codeSQL> create view view_rowtocol as select * from rowtocol_test where year=2009;
View created
SQL> execute row_to_col('view_rowtocol','year,month','dept','expenditure',Aggregate_func => 'sum',colorder => 'dept',roworder => '1,2',when_value_null => '0');
PL/SQL procedure successfully completed
SQL> select * from v_tmp;
YEAR MONTH 部门1 部门2 部门3
---------- ---------- ---------- ---------- ----------
2009 1 50000 0 0
2009 2 50000 40000 25000
2009 3 0 25000 0
SQL>
-----------------------------------------------------------
2.稍加修改,使用函数,返回游标。或利用过程里的传出参数SQL codecreate or replace function row_to_col_func(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
)return sys_refcursor
Authid Current_User
as
sqlstr varchar2(2000):='select '||group_col||' ';
c1 sys_refcursor;
v1 varchar2(100);
cur sys_refcursor;
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(to_char('||column_col||'),'''||v1||''','||value_col||'))'||
case when when_value_null is not null then chr(44) ||when_value_null||chr(41) end||'"'||v1||'"';
end loop;
close c1;
open cur for sqlstr||' from '||tabname||' group by '||group_col||case when roworder is not null then ' order by '||roworder end;
return cur;
end row_to_col_func;
在pl/sql dev中可以在sql窗口执行,查看结果
SQL codeselect
row_to_col_func('rowtocol_test','year,month','dept','expenditure',Aggregate_func => 'sum',colorder => 'dept',roworder => '1,2',when_value_null => '0')
from dual;
ROW_TO_COL_FUNC('ROWTOCOL_TEST
<Cursor>
YEAR MONTH 部门1 部门2 部门3
2009 1 50000 0 0
2009 2 50000 40000 25000
2009 3 0 25000 0
2010 1 35000 0 0
2010 2 0 0 60000
发表评论
-
层次化查询(start with ... connect by prior)
2010-09-02 17:33 798这里将介绍层次化查询 start with ... c ... -
在oracle中通过connect by prior来实现递归查询
2010-08-25 16:22 733connect by 是结构化查询 ... -
oracle sql 按日,周,月,年统计
2010-07-29 11:51 2247如: 表:consume_record 字段:consume ... -
EXISTS、IN、NOT EXISTS、NOT IN的区别
2010-07-29 11:50 1066EXISTS、IN、NOT EXISTS、NOT IN的区别: ... -
Oracle的优化器
2010-07-29 11:49 628一、目的: 1、说一说Oracle的Optimizer及其相 ... -
Oracle高效SQL语句原则
2010-07-29 11:48 727良好的SQL语句风格易于发现问题、易于阅读,移植性好。80%的 ...
相关推荐
- 索引不是万能的,过度索引可能导致插入、更新和删除操作变慢,需权衡利弊。 5. **绑定变量和硬解析**: - 使用绑定变量可以减少SQL语句的硬解析次数,提高性能。 - 绑定变量允许同一SQL模板使用不同的输入值,...
SQL用于创建、修改和查询数据库对象,如表、视图、索引等。了解如何编写有效的SELECT语句来查询数据,INSERT、UPDATE和DELETE语句来操作数据,以及CREATE和DROP命令来管理数据库结构,这些都是Oracle基础的重要组成...
Oracle关系数据库系统作为业界领先的数据管理解决方案,因其出色的性能、稳定性和安全性而在全球范围内被广泛应用。在Oracle数据库管理中,确保数据库的安全性尤为重要。其中,Oracle数据库系统的密码文件管理是保障...
除了类似于PL/SQL工具的SQL查询、表管理、视图管理、存储过程管理、JAVA_CLASS管理外,还支持直接DMP文件内容浏览、导入、导出、用户信息、表信息、性能信息等功能。 绝对的小巧灵笼,不太容易找,值20分,可惜这个...
2. **数据库表与视图**: 在数据库中,表是数据的基本存储单元,由列和行组成,用于存储结构化的信息。视图则是一种虚拟的表,它是从一个或多个实际表中选取数据的逻辑表示。视图不直接存储数据,而是根据需要动态...
3. **数据库管理**:系统可能使用了如MySQL、Oracle或SQL Server等关系型数据库,存储商品信息、订单数据和客户资料。数据库设计遵循规范化原则,确保数据的一致性和完整性。 4. **Spring框架**:作为Java企业级...
在数据库管理领域,万能数据浏览器v1.0可能是针对SQL Server、MySQL、Oracle、SQLite等常见数据库类型设计的。Delphi是一种基于Object Pascal的集成开发环境(IDE),以其高效的代码生成和对Windows平台的强大支持而...
尽管市面上存在诸如Oracle Enterprise Manager、SQL Navigator等工具,它们通过推荐索引方案、建议物化视图或在查询中添加提示来尝试不同的访问计划,但这些工具所依赖的规则集极为有限。它们能提供的,往往是一些...
无论是MySQL、SQL Server还是Oracle,用户都可以利用这款工具快速浏览数据库中的表、视图、存储过程,而无需直接连接到服务器。这对于开发者在离线环境下的调试和分析工作尤其有价值。 .db文件通常与SQLite数据库...
这款应用软件不仅覆盖了常见的MSSQL、ORACLE、SYSBASE、ACCESS、PARADOX和FOXPRO等数据库类型,还具备备份表、视图中的数据以及恢复数据的功能,甚至支持跨数据库的数据恢复,极大地满足了用户多样化的需求。...
《万能数据库通用查询分析器》支持多种数据库系统,如MySQL、Oracle、SQL Server、PostgreSQL等,这大大提高了其适用性,使得数据库管理员和开发者无需针对不同数据库系统分别使用不同的查询工具。 这款分析器的...
用户可以使用Navicat来创建、修改和管理ORACLE数据库对象,如表、视图、序列、索引等。同时,它也支持PL/SQL代码的编写和调试,以及数据的备份和恢复。通过数据迁移功能,Navicat还能帮助用户将数据从其他数据库迁移...
控件的数据源通常连接到数据库,它可以支持多种数据库系统,如MySQL、SQL Server、Oracle等。通过设置控件的属性,开发者可以指定连接字符串、选择要查询的表或视图,以及定义用户可以操作的字段。此外,该控件可能...
【JAVA万能日历记事本】的设计和实现中,可能运用了MVC(模型-视图-控制器)设计模式,将业务逻辑、界面展示和用户交互分离,提高代码的可维护性和可扩展性。同时,GUI(图形用户界面)的构建可能依赖于Java Swing或...
在Oracle数据库环境中,数据...然而,它并非万能解决方案,合理的数据管理和迁移策略,以及对Oracle数据库版本差异的理解,同样至关重要。在实际操作中,应结合官方文档、最佳实践和专业支持,确保数据安全和系统稳定。
因此,性能调优应当结合其他策略,如索引优化、查询重构、物化视图等,综合考虑以达到最佳效果。 总的来说,理解Oracle的Arraysize参数及其对逻辑读的影响至关重要。合理设置Arraysize能够有效减少网络开销,提升...
数据备份软件1.0版本分为ADO版和BDE版,其功能如下: 1).从各种数据库(如:... MSSQL脚本转ORACLE软件 矢量图绘制软件 报表套打软件 安装制作软件 超级注册软件 光辉看图软件
4. **数据浏览与操作**:用户可以通过表格视图轻松查看和编辑数据库中的数据,支持数据导入导出、批量更新和删除,以及数据比较和同步。这对于数据分析和数据迁移任务非常实用。 5. **数据库设计**:DBeaver提供了...
这个脚本会创建必要的存储过程、视图和表。 3. **配置参数**: 在初始化参数文件(init.ora或spfile)中设置`STATSPACK`参数,例如`STATSPACK_ASYNCH_ON=TRUE`以启用异步采样,这将提高性能分析的效率。 4. **授权**:...
例如,`tsfree.sql`视图可以帮助我们比较每个表空间的已用空间和剩余空间,从而判断是否需要扩展表空间或调整数据分布。 在ORACLE中,表的组织方式也会影响性能。这里提到了varray类型的使用,它是一种可变数组,...