oracle 列转行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 列转行相关的知识,希望对你有一定的参考价值。
有两张表
A 产品表
产品名称,产品编码
产品1 001
B销量表
产品编号 月份 销量
001 1 1000
001 2 2000
001 3 3000
。。。。。。
001 12 12000
通过sql语句如何输出
产品名称 产品编号 1月 2月 3月 。。。。。12月
产品1 001 1000 2000 3000 。。。。 12000
最后请教一个设计表的问题。想这种情况是如上表结构比较好呢?还是将B表设计为
产品编号 1月 2月 3月 。。。。。12月
create or replace procedure ptest as
strname varchar2(30);
str varchar2(1000);
strid varchar2(10);
cursor cur is select * from AB;
begin
str:='';
open cur;
loop
fetch cur into strid,strname;
exit when cur%notfound;
str:=str||strname||',';
end loop;
str:=substr(str,1,length(str)-1);
dbms_output.put_line(str);
end; 参考技术A 基本思路是运用case when语句,最好把创建表的语句给出(可用dbms_metadata.get_ddl,运行前把long设置大点)。
自己利用示例表得出需求,可以根据你自己的表来进行修改:
demo@ORCL>select max(case when deptno=10 then ename else null end) as "部门10",
max(case when deptno=20 then ename else null end) as "部门20",
max(case when deptno=30 then ename else null end) as "部门30"
from
(select deptno,ename,row_number() over(partition by deptno order by ename) rn from emp) x
group by rn order by 1,2,3;
部门10 部门20 部门30
---------- ---------- ---------
CLARK ADAMS ALLEN
KING FORD BLAKE
MILLER JONES JAMES
SCOTT MARTIN
SMITH TURNER
WARD 参考技术B oracle下可以用函数decode处理:
select t1.产品名称,t1.产品编号,
sum(decode(t2.月份,1,t2.销量,0)) 1月,
sum(decode(t2.月份,2,t2.销量,0)) 2月,
sum(decode(t2.月份,3,t2.销量,0)) 3月,
sum(decode(t2.月份,4,t2.销量,0)) 4月,
...
sum(decode(t2.月份,11,t2.销量,0)) 11月,
sum(decode(t2.月份,12,t2.销量,0)) 12月
from 产品表 t1, 销量表 t2
where t1.产品编码=t2.产品编码
group by t1.产品名称,t1.产品编号;
一般设计成你现有这样的结构就可以了.因为销量表是个明细记录表,记录数比较大. 参考技术C select a.产品名称,b.产品编码, wmsys.wm_concat(销量) from 产品表 a, 销量表 b where a.产品编号 = b.产品编码 group by a.产品名称 ,b.产品编码
Oracle列转行,行转列
我现在的表如下:
产品名称 销售额 季度
奶酪 50 第一季度
奶酪 60 第二季度
啤酒 50 第二季度
啤酒 80 第四季度
。。。
。。。
想转换成如下格式
产品名称 第一季度销售额 第二季度销售额 第三季度销售额 第四季度销售额
奶酪 50 60 0 0
啤酒 0 50 0 80
请问该如何转换呢~产品名称的数据量很大,非常感激,Oracle的~
select 产品名称,
sum(decode(季度,'第一季度',销售额,0)) 第一季度销售额,
sum(decode(季度,'第二季度',销售额,0)) 第二季度销售额,
sum(decode(季度,'第三季度',销售额,0)) 第三季度销售额,
sum(decode(季度,'第四季度',销售额,0)) 第四季度销售额,
from 表名
group by 产品名称; 参考技术A select 产品名称,sum(case when 季度='第一季度' then 销售额 else 0 end) as 第一季度销售额,
sum(case when 季度='第二季度' then 销售额 else 0 end) as 第二季度销售额,
sum(case when 季度='第三季度' then 销售额 else 0 end) as 第三季度销售额,
sum(case when 季度='第四季度' then 销售额 else 0 end) 第四季度销售额
from 表名 group by 产品名称; 参考技术B select 产品名称,
max(case when 季度=‘第一季度’then 销售额 else 0 end)as 第一季度销售额,
max(case when 季度=‘第二季度’then 销售额 else 0 end)as 第二季度销售额,
max(case when 季度=‘第三季度’then 销售额 else 0 end)as 第三季度销售额,
max(case when 季度=‘第四季度’then 销售额 else 0 end)as 第四季度销售额,
sum(销售额)as 总销售额 /////可可选可不选
from 表
group by 产品名称
having sum(销售额)>数值 /////可选可不选
以上是关于oracle 列转行的主要内容,如果未能解决你的问题,请参考以下文章