`
IT独行者
  • 浏览: 12024 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Oracle利用CASE WHEN实现动态行转列(游标)

阅读更多

前段时间在使用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:返回参数,将最终的记录集返回

0
0
分享到:
评论

相关推荐

    sql.txt 存储过程行列转置(oracle)

    oracle 存储过程,实现列表数据行转置成列显示table效果;用游标的方式实现;

    Oracle sql文总结(case when,查看执行计画,文本操作,查看锁表及解锁,游标)

    Oracle sql文总结(case when,查看执行计画,文本操作,查看锁表及解锁,游标)

    Oracle Exception汇总(自定义Oracle异常)

    Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE...

    Oracle游标使用参考语句实例解析

    游标是从表中检索出结果集,从中每次指向一条记录进行交互的机制。 作用 指定结果集中特定行的位置。 基于当前的结果集位置检索一行或连续的几行。 在结果集的当前位置修改行中的数据。 对其他用户所做的数据...

    oracle知识总结

    oracle系统学习总结包涵oracle的语法if else case when,触发器 游标函数等常用知识总结,希望对你有帮助!

    oracle存储过程进阶

    介绍了oracle存储过程中常见的sql写法,游标(隐式,显式),触发器, CASE ... WHEN ... THEN ...ELSE ... END,IF... THEN ... ELSIF ...THEN...ELSE...END IF,记录类型变量定义和使用 ,%type定义变量,%rowtype定义变量...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    Oracle的系统异常编码及解释

    CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 COLLECTION_IS_NULL 集合元素未初始化 CURSER_ALREADY_OPEN 游标已经打开 DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值 INVALID_CURSOR ...

    Oracle事例

    check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据...

    Oracle 下的开发日积月累

    Oracle SQL语句中的Update可以和SEQUENCE联合使用,以达到更新某字段的值连续编号,而不需要使用游标去逐条遍历更新数据库记录。例如 update sample set id = seq_id.nextval; Oracle中的select语句允许使用...

    xls转mdb代码以及.exe执行软件

    +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 ...

    SQL培训第一期

    伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * ...

    mysql数据库的基本操作语法

    注意:alter modify不支持一次修改多个列,但是Oracle支持多列修改 但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) ...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    收获不止SQL优化

    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 ...

Global site tag (gtag.js) - Google Analytics