oracle行列转换问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle行列转换问题相关的知识,希望对你有一定的参考价值。
有一个苗木表,字段有苗木类型type,面积area,株数,qty,产值,price,请问怎么写sql才能得到下图的信息呢
只能查出对应的 面积(area),株数(qty),产值(price) 值,表头是需要自己去弄,真对数据如下:南厂,苗木1,花灌木,10,10,10
北厂,苗木2,花卉,10,10,10,
其它,苗木3,针叶松,10,10,10
这份数据,脚本如下
select sum(tt.南厂area1),sum(tt.南厂qty1),sum(tt.南厂price1),
sum(tt.北厂area2),sum(tt.北厂qty2),sum(tt.北厂price2),
sum(tt.其它area2),sum(tt.其它qty2),sum(tt.其它price2)
from (
select t.area as 南厂area1 ,t.qty as 南厂qty1,t.price 南厂price1,0 as 北厂area2,0 as 北厂qty2,0 as 北厂price2,
,0 as 其它area3,0 as 其它qty3,0 as 其它price3
from table_name t
where t.filed = '南厂' and t.name = '苗木1' and t.'type' = '花灌木'
union all
select 0 as 北厂area1,0 as 北厂qty1,0 as 北厂price1,t.area as 北厂area2 ,t.qty as 北厂qty2,t.price 北厂price2,
0 as 北厂area3,0 as 北厂qty3,0 as 北厂price3
from table_name t
where t.filed = '北厂' and t.name = '苗木2' and t.'type' = '花卉'
union all
select 0 as 北厂area1,0 as 北厂qty1,0 as 北厂price1,0 as 北厂area2,0 as 北厂qty2,0 as 北厂price2,
t.area as 北厂area3 ,t.qty as 北厂qty3,t.price 北厂price3
from table_name t
where t.filed = '其它' and t.name = '苗木3' and t.'type' = '花针叶松'
) tt 参考技术A 增加一列场区aID,树木类型Ttype,表名Tree。
select x.ttype,x.area,x.qty,x.price,y.ttype,y.area,y.qty,y.price,
z.ttype,z.area,z.qty,z.price,w.ttype,w.area,w.qty,w.price
from TREE x,TREE y,TREE z,TREE w
where x.aid=y.aid and y.aid=z.aid and z.aid=w.aid and
x.ttype='针叶树' and y.ttype='阔叶树' and z.ttype='花灌木' and w.ttype='花卉';
表格和标题你自己用html里面的table画,数据可以用上面的句子获得就可以了(去掉树木名字)。追问
大哥,感觉这样写不对啊,第一列是场别有南厂北厂,那
个阔叶树什么的下面还有具体的苗木,要统计他们类别的面积,株数,产值
你只给一个结果图,只能按结果图设定SQL语句了。关于原数据的的来源、结构等都不清楚啊。原数据到底如何存放的?是什么样结构?
追问他们都在一个table表中,字段分别为场别(filed),苗木(name),苗木类型(type),面积(area),株数(qty),产值(price)。
数据如下:南厂,苗木1,花灌木,10,10,10
北厂,苗木2,花卉,10,10,10,
其它,苗木3,针叶松,10,10,10
select type, max(area), max(qty), max(price) from table group by type;
不知道是不是你想要的效果,试试看吧。如果要根据类型求和,可以讲max换成sum追问
我前台是用的flex用的一个datagrid类似table的显示列表,现在就是不知道怎么处理数据格式让查询出来的结果跟前台的每一列都对应上
追答flex我不了解,不过你可以参考其他select语句的结果集如何获取,然后使用上面的语句,都是一样的。
不论前台是什么语言,只是要连接数据库,就肯定能够获取结果集,然后使用循环或者迭代来取值。
就是类似html里面的table,每个列对应一个后台的字段,查出来应该是max(area1),max(qty1),max(price1),max(area2),max(qty2),max(price2),max(area3),max(qty3),max(price3),只要把sql变成结果是这样就行了。
Oracle 行列转换
1. 列转行
使用Oracle提供的功能函数,wm_concat, 但要注意,使用该函数转换出来的值是blob类型,需要手动转换成char类型;
代码如下:
to_char(wm_concat(column)) -- 竖杠为分隔符 select replace(wm_concat(name),‘,‘,‘|‘) from test;
2. 行转列
Oracle本身没有提供行转列功能,需要自己实现,下面是解析使用逗号隔开的字符串转换成列的示例:
-- 定义返回类型 create or replace type acc_type as object (acc varchar2(50)) / create or replace type acc_table as table of acc_type / create or replace function str2table (acc_str in varchar2) return acc_table pipelined is v_str varchar2(30000) := acc_str; v_acc varchar2(30); v_acc_end pls_integer; begin loop v_acc_end := instrb(v_str,‘,‘); exit when (v_acc_end=0 or v_str is null); v_acc := substrb(v_str,1,v_acc_end-1); v_str := ltrim(v_str,v_acc); v_str := ltrim(v_str,‘,‘); pipe row(acc_type(rtrim(v_acc,‘;‘))); end loop; return; end; /
以上是关于oracle行列转换问题的主要内容,如果未能解决你的问题,请参考以下文章