`

oracle中行转列的sql语句动态

阅读更多
create table T_TEST
(
  CITY        VARCHAR2(255) not null,
  YEAR        NUMBER(4) not null,
  MONTH       NUMBER(2) not null,
  SELL_AMOUNT NUMBER(26,2)
)

comment on table T_TEST
  is '各月世联在主要核心城市的销售金额';
comment on column T_TEST.CITY
  is '城市';
comment on column T_TEST.SELL_AMOUNT
  is '比如0.42代表42%';


insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('深圳', 2010, 5, 1.2);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('东莞', 2010, 5, .8);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('佛山', 2010, 5, .9);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('汕头', 2010, 5, .22);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('长沙', 2010, 5, .28);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('深圳', 2010, 4, 1.1);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('东莞', 2010, 4, .8);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('佛山', 2010, 4, .9);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('广州', 2010, 4, .67);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('汕头', 2010, 4, .22);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('长沙', 2010, 4, .28);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('深圳', 2010, 3, .9);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('佛山', 2010, 3, .9);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('广州', 2010, 3, .67);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('汕头', 2010, 3, .22);
insert into T_TEST (CITY, YEAR, MONTH, SELL_AMOUNT)
values ('长沙', 2010, 3, .28);
commit;


---存储过程生成行转列sql语句
create or replace procedure P_test1 is

    cursor   csr   is
        select   distinct   (city)   from   t_test;
    tmp_km   varchar2(400);
    str         varchar2(4000);
begin

/*select   t.year||t.month,
sum(decode(t.city, '深圳',t.sell_amount,0)) 深圳  ,
sum(decode(t.city, '佛山',t.sell_amount,0))   佛山,
sum(decode(t.city, '东莞',t.sell_amount,0))   东莞
from   t_test t
group   by   t.month,t.year
*/


    str   :=   'select   t.year||t.month ';
    open   csr;
      loop   fetch   csr   into   tmp_km;
    exit   when   csr%notfound;
    str   :=   str   ||   ',sum(decode(t.city, '   ||   chr(39)   ||   tmp_km   ||   chr(39)   ||
                  ',t.sell_amount,0))   '   ||   tmp_km;
end   loop;
str   :=   str   ||   '   from   t_test t   group   by   t.month,t.year';
dbms_output.put_line(str);



execute   immediate   str;

end P_test1;

//生成集合
create or replace procedure P_test1(p_Year NUMBER,p_Cursor OUT SYS_REFCURSOR) is

    cursor   csr   is
        select   distinct   (city)   from   t_test;
    tmp_km   varchar2(400);
    str         varchar2(4000);
begin

/*select   t.year||t.month,
sum(decode(t.city, '深圳',t.sell_amount,0)) 深圳  ,
sum(decode(t.city, '佛山',t.sell_amount,0))   佛山,
sum(decode(t.city, '东莞',t.sell_amount,0))   东莞
from   t_test t
group   by   t.month,t.year
*/


    str   :=   'select   t.year||t.month ';
    open   csr;
      loop   fetch   csr   into   tmp_km;
    exit   when   csr%notfound;
    str   :=   str   ||   ',sum(decode(t.city, '   ||   chr(39)   ||   tmp_km   ||   chr(39)   ||
                  ',t.sell_amount,0))   '   ||   tmp_km;
end   loop;
str   :=   str   ||   '   from   t_test t  where t.year='||p_Year||'  group   by   t.month,t.year';
dbms_output.put_line(str);

open p_Cursor for str;

exception

when others then

Dbms_Output.Put_Line('error');

close p_Cursor;


end P_test1;
分享到:
评论

相关推荐

    oracle行转列较精典的解决方案

    ### Oracle行转列的经典解决方案 在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中...以上就是Oracle中行转列的几种经典解决方案,每种方法都有其适用场景和特点,实际应用时可根据具体需求选择合适的方法。

    oracle一条sql语句分页

    ROWNUM 是一个虚拟列,用于返回表中行的顺序号。当表中的每一行被检索时,Oracle会自动为每一行分配一个ROWNUM值,该值默认从1开始递增。需要注意的是,ROWNUM的计算是在SQL语句执行的过程中完成的,并且一旦为某一...

    oracle行转列

    综上所述,掌握Oracle中行转列的技术对于数据分析师、数据库管理员以及其他需要处理大量数据的专业人士而言至关重要。通过灵活运用SQL语句,我们不仅能够提高数据处理的效率,还能确保数据的准确性和完整性,为业务...

    SQL 通过行动态生成列

    动态SQL允许我们在运行时构建并执行SQL语句,使得列的生成可以根据输入参数或查询结果动态调整。 4. **自连接或子查询**:在不支持PIVOT操作的数据库中,可以利用自连接或子查询来模拟行转列。例如,可以通过创建一...

    OracleSQL精妙SQL语句讲解[定义].pdf

    子查询是嵌套在其他SQL语句中的查询,可以作为查询的一部分提供临时结果。 Oracle支持多种数据类型,如: - `NUMBER`:用于数值存储,可以存储整数和小数。 - `VARCHAR2`:可变长度的字符串,最大长度为2000字符。 ...

    sql语句妙用,各种sql语句的详细用法与讲解

    动态SQL是SQL的一个重要特性,它允许在运行时构建和执行SQL语句。这在处理不确定的表名、字段名或查询条件时非常有用。例如,当你需要根据用户输入的字段名称查询数据时,动态SQL就派上了用场。动态SQL的基本语法...

    Oracle的数据表中行转列与列转行的操作实例讲解

    总结来说,Oracle的行转列和列转行操作主要依赖于SQL的内置功能,如CASE语句、DECODE函数和UNION ALL,以及在动态SQL中的条件构建。理解并熟练运用这些技巧,可以帮助数据库管理员更好地处理和展示复杂的数据结构。

    30个Oracle语句优化规则详解

    为了提高SQL语句的执行效率和减少内存占用,Oracle采用了SQL语句共享机制。 1. **SQL语句缓存**:首次解析后,Oracle会在共享池(shared pool)中缓存SQL语句及其执行计划。共享池位于系统全局区域(SGA)中,所有...

    Oracle SQl

    - SQL*PLUS是Oracle提供的一个命令行工具,用于交互式地执行SQL语句和PL/SQL块。 - 登录、退出:通过用户名和口令登录,使用EXIT命令退出。 - 编辑和运行SQL命令:可以使用分号、斜杠或空行作为命令结束标志,...

    oracle数据库伪列简单介绍

    在Oracle数据库中,存在一种特殊的数据类型被称为“伪列”,这些伪列虽然看起来像是表中的列,但实际上它们并不存储任何数据,而是由数据库动态生成的。本文将重点介绍两种常用的伪列——rownum和rowid,并探讨它们...

    ORACLE SQL性能优化系列

    3. **绑定变量必须相同**:绑定变量是SQL语句中用于动态值的占位符。如果两个SQL语句中的绑定变量名称不同,它们的执行计划也不会被共享。 #### 总结 Oracle的SQL性能优化是一个复杂但至关重要的主题,涵盖了优化...

    oracle语句优化

    - 可以在SQL语句级别或会话级别动态更改优化器的设置。 #### 二、访问Table的方式及其优化 **2.1 全表扫描 (Full Table Scan)** - 当Oracle数据库需要访问表中的所有记录时,会进行全表扫描。 - Oracle通过一次...

    SQL语句教程简洁入门版

    在数据库领域,SQL(结构化查询语言)是用于管理关系数据库的标准...通过理解上述知识点,读者可以开始构建自己的SQL语句,并从数据库中检索信息。记住,熟练使用SQL需要时间和实践,不断练习是掌握SQL不可或缺的一环。

    Oracle sql 性能优化调整

    为了提高性能,Oracle会在共享缓冲池(shared buffer pool)中缓存执行过的SQL语句。这意味着当执行相同的SQL语句时,Oracle可以直接从缓存中调用执行计划,节省了重新解析和创建执行计划的时间。然而,这种缓存机制...

    数据库SQL查询语句.docx

    ` 这条SQL语句用于查询名为"DEPARTMENT"的表中的所有列。`*`代表所有列,`"RESOURCES"."DEPARTMENT"`是表的全限定名,其中"RESOURCES"是模式或schema的名称,"DEPARTMENT"是表的名称。这通常用于获取表中的全部数据...

    sql高级进阶

    - 将分隔数据转换为多值IN列表:利用动态SQL实现。 - 按字母顺序排列字符串:使用ORDER BY对字符串字段排序。 - 字段内list值去重:在字段值中去除重复项。 - 判别可作为数值的字符串:使用正则表达式或数据库...

Global site tag (gtag.js) - Google Analytics