`
IT独行者
  • 浏览: 12566 次
  • 性别: 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语句、查看执行计划、文本操作、锁定和解锁表以及游标。以下是对这些知识点的详细解释: 1. **CASE WHEN语句**: CASE WHEN是SQL中的一个条件...

    oracle某个字段多行记录转化为一行

    为了实现将Oracle数据库中某个字段的多行记录合并成一行记录的目标,可以采用编写自定义函数的方法。下面详细介绍该方法的具体步骤: #### 创建函数 `f_m_t` 首先,创建一个名为`f_m_t`的函数,该函数接受一个参数...

    oracle到sqlserver存储过程语法转换

    - **Oracle**: 使用`ROWID`和`ROWNUM`进行行标识和计数。 ```sql SELECT * FROM table WHERE ROWNUM ; ``` - **SQL Server**: 使用`TOP`来限制返回的行数。 ```sql SELECT TOP 10 * FROM table; ``` **5. ...

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

    4. **CASE_NOT_FOUND** (ORA-06592): 使用`CASE`语句时,如果`WHEN`子句中没有匹配的条件分支并且没有`ELSE`语句,就会引发此异常。解决办法是在`CASE`语句中提供一个默认的`ELSE`分支。 5. **COLLECTION_IS_NULL**...

    ORACLE转DB2对照全解

    ### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...

    Oracle中的SUM用法讲解

    在Oracle中,SUM函数可以结合CASE WHEN语句,使得条件求和变得更为灵活。 1. SUM与CASE WHEN结合使用 在描述的示例1中,我们看到了一个查询,它根据`AREA_CODE`字段对数据进行分组,并计算出`IPTV_NBR`和`ACC_NBR`...

    oracle转DB2 对照

    ### Oracle转DB2对照知识点详解 #### 1. Oracle SQL PL 和 DB2 inline SQL PL (内嵌) 比较 ##### 1.1 创建存储过程 - **Oracle**: 支持 `CREATE OR REPLACE` 语法,允许在已有存储过程的基础上进行替换。 ```sql ...

    oracle交叉表sql

    在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式存储,从而方便观察不同维度之间的关系。这种表格形式在报表展示、多维分析等方面...

    oracle中游标的使用

    Oracle 中的游标(Cursor)是一种重要的数据库对象,它允许开发者在 SQL 语句中处理大量数据。游标的使用可以将复杂的数据处理过程简化,使得开发效率和代码可读性提高。下面将对 Oracle 中游标的使用进行详细的解释...

    oracle知识总结

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

    学习oracle笔记(word版本)

    CASE WHEN THEN END CASE结构允许基于不同条件执行不同的动作。 5. **循环结构**:Oracle PL/SQL支持多种循环结构,如WHILE、FOR和LOOP。例如,`FOR循环`常用于遍历范围或集合,而`LOOP WITH EXIT WHEN`可以实现更...

    oracle预定义异常

    2. CASE_NOT_FOUND:在CASE语句中,如果没有任何WHEN子句匹配条件,且没有设置ELSE部分,就会触发此异常。 3. COLLECTION_IS_NULL:当你试图操作一个未初始化的集合(如数组或列表)时,Oracle会抛出此异常。 4. ...

    SQL Server vs Oracle 存储过程语法转换1.2.docx

    - Oracle的`CASE...WHEN...THEN...END;` - SQL Server的`CASE WHEN...THEN...END;` 8. **游标**: - Oracle中定义游标使用`CURSOR`关键字,打开、关闭和循环使用`OPEN`, `FETCH`, `CLOSE`,如: ```sql ...

    SQLServer和Oracle的常用函数

    - SQL Server的`IIF()`是三元运算符的简化形式,Oracle没有直接对应,但可以用`CASE WHEN THEN END`模拟。 7. **系统信息函数** - SQL Server的`@@IDENTITY`获取最后一个插入的ID,Oracle使用`LAST_INSERT_ID()`...

    ORACLE复习资料

    EXIT WHEN 游标变量%NOTFOUND; -- 处理每一行数据 END LOOP; CLOSE 游标变量; END; ``` 通过学习和实践这些DML和PL/SQL实例,你可以深入了解Oracle数据库的日常操作,并为更高级的数据库管理和开发打下坚实...

    Oracle PL/SQL Programming

    8. **游标变量和记录类型**:游标变量可以存储游标的当前状态,而记录类型可以用来创建自定义的数据结构,方便处理多列数据。 9. **包(Package)**:包是PL/SQL的高级特性,可以封装相关的变量、过程和函数,提高...

    Oracle 存储过程异常处理.docx

    Oracle 提供了预定义的内部异常,如 SELECT INTO 语句不返回行时产生的 NO_DATA_FOUND 异常、除数为零的 ZERO_DIVIDE 异常等。对于预定义异常,现将最常用的异常列举如下: * NO_DATA_FOUND(ORA-01403):SELECT ...

    Oracle的PL SQL笔记

    在JDBC中使用的`ResultSet`对象就利用了隐式游标的原理。 **2. 显示游标** 显示游标需要用户自己定义、打开、获取和关闭。 ```sql DECLARE CURSOR myc IS SELECT * FROM EMP; -- 声明游标 myremp%ROWTYPE; BEGIN ...

Global site tag (gtag.js) - Google Analytics