前段时间在使用Oracle开发数据统计的时候,遇到一个动态行转列、列转行的问题,最终实现如下的效果:
当初设计表的时候,指标、数据及公司在一张表里,现在要求列是动态维护的,也就是说需要多表关联,实现动态行转列,想了半天最后选择用Oracle存储过程加游标来做,下面把这个存储过程分享给大家,有不足的地方大家可以继续补充:
表1:数据存放表(bp_j_stat_ytz)
表2:指标维护表(BP_J_POWER_GENERATION_ITEM)
表3:基础资料表(bp_c_stat_item)
存储过程代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
procedure pro_tj_dj_date(d_date date ,ds out ds_cur) as
v_sql varchar2(10000);
v_sql_t varchar2(5000);
begin
v_sql_t := '' ;
for c in (
select * from BP_J_POWER_GENERATION_ITEM i
where i.is_use= 'Y'
order by i.standard_code
) loop
v_sql_t := v_sql_t || 'sum(case i.standard_item_code
when ' '' || c.standard_code || '' ' then y.data_value
end) as ' || c.item_name || ',' ;
end loop;
v_sql := '
select ' || v_sql_t || '
i.org_code
from BP_J_POWER_GENERATION_ITEM t
left join bp_c_stat_item i
on t.standard_code=i.standard_item_code
left join bp_j_stat_ytz y
on i.item_code = y.item_code and y.data_date=' '' || d_date || '' '
group by i.org_code' ;
open ds for v_sql;
end pro_tj_dj_date;
|
参数解释:
d_date:日期,表示要查询某个日期下的数据
ds:返回参数,将最终的记录集返回
相关推荐
oracle 存储过程,实现列表数据行转置成列显示table效果;用游标的方式实现;
Oracle sql文总结(case when,查看执行计画,文本操作,查看锁表及解锁,游标)
Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE...
游标是从表中检索出结果集,从中每次指向一条记录进行交互的机制。 作用 指定结果集中特定行的位置。 基于当前的结果集位置检索一行或连续的几行。 在结果集的当前位置修改行中的数据。 对其他用户所做的数据...
oracle系统学习总结包涵oracle的语法if else case when,触发器 游标函数等常用知识总结,希望对你有帮助!
介绍了oracle存储过程中常见的sql写法,游标(隐式,显式),触发器, CASE ... WHEN ... THEN ...ELSE ... END,IF... THEN ... ELSIF ...THEN...ELSE...END IF,记录类型变量定义和使用 ,%type定义变量,%rowtype定义变量...
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 COLLECTION_IS_NULL 集合元素未初始化 CURSER_ALREADY_OPEN 游标已经打开 DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值 INVALID_CURSOR ...
check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据...
Oracle SQL语句中的Update可以和SEQUENCE联合使用,以达到更新某字段的值连续编号,而不需要使用游标去逐条遍历更新数据库记录。例如 update sample set id = seq_id.nextval; Oracle中的select语句允许使用...
+case when isnull(@username,'')='' then '' else ' /U '+@username end +' /P '+isnull(@password,'') exec master..xp_cmdshell @sql fetch next from #tb into @m_tbname end close #tb deallocate #tb end go ...
伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * ...
注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改 但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) ...
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...
12.1.1 Case When改造 334 12.1.2 Rownum分页改写 337 12.1.3 Hint直接路径改造 338 12.1.4 只取你所需的列 339 12.1.5 避免或者减少递归调用 341 12.1.6 ROWID优化应用 347 12.2 设法避免外因影响 350 ...