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中行转列的几种经典解决方案,每种方法都有其适用场景和特点,实际应用时可根据具体需求选择合适的方法。
ROWNUM 是一个虚拟列,用于返回表中行的顺序号。当表中的每一行被检索时,Oracle会自动为每一行分配一个ROWNUM值,该值默认从1开始递增。需要注意的是,ROWNUM的计算是在SQL语句执行的过程中完成的,并且一旦为某一...
综上所述,掌握Oracle中行转列的技术对于数据分析师、数据库管理员以及其他需要处理大量数据的专业人士而言至关重要。通过灵活运用SQL语句,我们不仅能够提高数据处理的效率,还能确保数据的准确性和完整性,为业务...
动态SQL允许我们在运行时构建并执行SQL语句,使得列的生成可以根据输入参数或查询结果动态调整。 4. **自连接或子查询**:在不支持PIVOT操作的数据库中,可以利用自连接或子查询来模拟行转列。例如,可以通过创建一...
子查询是嵌套在其他SQL语句中的查询,可以作为查询的一部分提供临时结果。 Oracle支持多种数据类型,如: - `NUMBER`:用于数值存储,可以存储整数和小数。 - `VARCHAR2`:可变长度的字符串,最大长度为2000字符。 ...
动态SQL是SQL的一个重要特性,它允许在运行时构建和执行SQL语句。这在处理不确定的表名、字段名或查询条件时非常有用。例如,当你需要根据用户输入的字段名称查询数据时,动态SQL就派上了用场。动态SQL的基本语法...
总结来说,Oracle的行转列和列转行操作主要依赖于SQL的内置功能,如CASE语句、DECODE函数和UNION ALL,以及在动态SQL中的条件构建。理解并熟练运用这些技巧,可以帮助数据库管理员更好地处理和展示复杂的数据结构。
为了提高SQL语句的执行效率和减少内存占用,Oracle采用了SQL语句共享机制。 1. **SQL语句缓存**:首次解析后,Oracle会在共享池(shared pool)中缓存SQL语句及其执行计划。共享池位于系统全局区域(SGA)中,所有...
- SQL*PLUS是Oracle提供的一个命令行工具,用于交互式地执行SQL语句和PL/SQL块。 - 登录、退出:通过用户名和口令登录,使用EXIT命令退出。 - 编辑和运行SQL命令:可以使用分号、斜杠或空行作为命令结束标志,...
在Oracle数据库中,存在一种特殊的数据类型被称为“伪列”,这些伪列虽然看起来像是表中的列,但实际上它们并不存储任何数据,而是由数据库动态生成的。本文将重点介绍两种常用的伪列——rownum和rowid,并探讨它们...
3. **绑定变量必须相同**:绑定变量是SQL语句中用于动态值的占位符。如果两个SQL语句中的绑定变量名称不同,它们的执行计划也不会被共享。 #### 总结 Oracle的SQL性能优化是一个复杂但至关重要的主题,涵盖了优化...
- 可以在SQL语句级别或会话级别动态更改优化器的设置。 #### 二、访问Table的方式及其优化 **2.1 全表扫描 (Full Table Scan)** - 当Oracle数据库需要访问表中的所有记录时,会进行全表扫描。 - Oracle通过一次...
在数据库领域,SQL(结构化查询语言)是用于管理关系数据库的标准...通过理解上述知识点,读者可以开始构建自己的SQL语句,并从数据库中检索信息。记住,熟练使用SQL需要时间和实践,不断练习是掌握SQL不可或缺的一环。
为了提高性能,Oracle会在共享缓冲池(shared buffer pool)中缓存执行过的SQL语句。这意味着当执行相同的SQL语句时,Oracle可以直接从缓存中调用执行计划,节省了重新解析和创建执行计划的时间。然而,这种缓存机制...
` 这条SQL语句用于查询名为"DEPARTMENT"的表中的所有列。`*`代表所有列,`"RESOURCES"."DEPARTMENT"`是表的全限定名,其中"RESOURCES"是模式或schema的名称,"DEPARTMENT"是表的名称。这通常用于获取表中的全部数据...
- 将分隔数据转换为多值IN列表:利用动态SQL实现。 - 按字母顺序排列字符串:使用ORDER BY对字符串字段排序。 - 字段内list值去重:在字段值中去除重复项。 - 判别可作为数值的字符串:使用正则表达式或数据库...