前段时间在使用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语句、查看执行计划、文本操作、锁定和解锁表以及游标。以下是对这些知识点的详细解释: 1. **CASE WHEN语句**: CASE WHEN是SQL中的一个条件...
为了实现将Oracle数据库中某个字段的多行记录合并成一行记录的目标,可以采用编写自定义函数的方法。下面详细介绍该方法的具体步骤: #### 创建函数 `f_m_t` 首先,创建一个名为`f_m_t`的函数,该函数接受一个参数...
- **Oracle**: 使用`ROWID`和`ROWNUM`进行行标识和计数。 ```sql SELECT * FROM table WHERE ROWNUM ; ``` - **SQL Server**: 使用`TOP`来限制返回的行数。 ```sql SELECT TOP 10 * FROM table; ``` **5. ...
4. **CASE_NOT_FOUND** (ORA-06592): 使用`CASE`语句时,如果`WHEN`子句中没有匹配的条件分支并且没有`ELSE`语句,就会引发此异常。解决办法是在`CASE`语句中提供一个默认的`ELSE`分支。 5. **COLLECTION_IS_NULL**...
### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...
在Oracle中,SUM函数可以结合CASE WHEN语句,使得条件求和变得更为灵活。 1. SUM与CASE WHEN结合使用 在描述的示例1中,我们看到了一个查询,它根据`AREA_CODE`字段对数据进行分组,并计算出`IPTV_NBR`和`ACC_NBR`...
### Oracle转DB2对照知识点详解 #### 1. Oracle SQL PL 和 DB2 inline SQL PL (内嵌) 比较 ##### 1.1 创建存储过程 - **Oracle**: 支持 `CREATE OR REPLACE` 语法,允许在已有存储过程的基础上进行替换。 ```sql ...
在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式存储,从而方便观察不同维度之间的关系。这种表格形式在报表展示、多维分析等方面...
Oracle 中的游标(Cursor)是一种重要的数据库对象,它允许开发者在 SQL 语句中处理大量数据。游标的使用可以将复杂的数据处理过程简化,使得开发效率和代码可读性提高。下面将对 Oracle 中游标的使用进行详细的解释...
oracle系统学习总结包涵oracle的语法if else case when,触发器 游标函数等常用知识总结,希望对你有帮助!
CASE WHEN THEN END CASE结构允许基于不同条件执行不同的动作。 5. **循环结构**:Oracle PL/SQL支持多种循环结构,如WHILE、FOR和LOOP。例如,`FOR循环`常用于遍历范围或集合,而`LOOP WITH EXIT WHEN`可以实现更...
2. CASE_NOT_FOUND:在CASE语句中,如果没有任何WHEN子句匹配条件,且没有设置ELSE部分,就会触发此异常。 3. COLLECTION_IS_NULL:当你试图操作一个未初始化的集合(如数组或列表)时,Oracle会抛出此异常。 4. ...
- Oracle的`CASE...WHEN...THEN...END;` - SQL Server的`CASE WHEN...THEN...END;` 8. **游标**: - Oracle中定义游标使用`CURSOR`关键字,打开、关闭和循环使用`OPEN`, `FETCH`, `CLOSE`,如: ```sql ...
- SQL Server的`IIF()`是三元运算符的简化形式,Oracle没有直接对应,但可以用`CASE WHEN THEN END`模拟。 7. **系统信息函数** - SQL Server的`@@IDENTITY`获取最后一个插入的ID,Oracle使用`LAST_INSERT_ID()`...
EXIT WHEN 游标变量%NOTFOUND; -- 处理每一行数据 END LOOP; CLOSE 游标变量; END; ``` 通过学习和实践这些DML和PL/SQL实例,你可以深入了解Oracle数据库的日常操作,并为更高级的数据库管理和开发打下坚实...
8. **游标变量和记录类型**:游标变量可以存储游标的当前状态,而记录类型可以用来创建自定义的数据结构,方便处理多列数据。 9. **包(Package)**:包是PL/SQL的高级特性,可以封装相关的变量、过程和函数,提高...
Oracle 提供了预定义的内部异常,如 SELECT INTO 语句不返回行时产生的 NO_DATA_FOUND 异常、除数为零的 ZERO_DIVIDE 异常等。对于预定义异常,现将最常用的异常列举如下: * NO_DATA_FOUND(ORA-01403):SELECT ...
在JDBC中使用的`ResultSet`对象就利用了隐式游标的原理。 **2. 显示游标** 显示游标需要用户自己定义、打开、获取和关闭。 ```sql DECLARE CURSOR myc IS SELECT * FROM EMP; -- 声明游标 myremp%ROWTYPE; BEGIN ...