十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.前言:通过使用FineBI进行“点地图”方式来展现数据。
成都创新互联是一家集网站建设,绥宁企业网站建设,绥宁品牌网站建设,网站定制,绥宁网站建设报价,网络营销,网络优化,绥宁网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
2.遇到的问题:原始表 经纬度 是一个字段保存,比如 xy列 中某行值为“130.111111,33.999999”。
3.解决的方法:通过 xy列 中’,‘逗号并使用函数substr()和函数instr() 处理后效果图和SQL示例如下
4.附注:
substr函数的用法 :
取得字符串中指定起始位置和长度的字符串 ,默认是从起始位置到结束的子串。
substr( string, start_position, [ length ] ) 即: substr('目标字符串',开始位置,长度)
instr函数的用法 :
格式一:instr( string1, string2 ) 即: instr(源字符串, 目标字符串),本案例是使用此格式。
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) 即:instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
instr是一个非常好用的字符串处理函数,几乎所有的字符串分隔都用到此函数。
方法有如下两种:
1、利用存储过程,先查出所要的数据,循环放入一列中:
select 编码,decode(一级,null,null,一级||'')||decode(二级,null,null,二级||'')||decode(三级,null,null,三级||'')||decode(四级,null,null,四级||'') from 表名
2、使用wm_concat()方法,如select wm_concat(name) as name from user;
Oracle 11g 行列互换 pivot 和 unpivot 说明在Oracle 11g中,Oracle 又增加了2个查询:pivot(行转列) 和unpivot(列转行)
参考:、 一下,网上有一篇比较详细的文档:
pivot 列转行
测试数据 (id,类型名称,销售数量),案例:根据水果的类型查询出一条数据显示出每种类型的销售数量。
?
123456789
create table demo(id int,name varchar(20),nums int); ---- 创建表insert into demo values(1, '苹果', 1000);insert into demo values(2, '苹果', 2000);insert into demo values(3, '苹果', 4000);insert into demo values(4, '橘子', 5000);insert into demo values(5, '橘子', 3000);insert into demo values(6, '葡萄', 3500);insert into demo values(7, '芒果', 4200);insert into demo values(8, '芒果', 5500);
分组查询 (当然这是不符合查询一条数据的要求的)
?
1
select name, sum(nums) nums from demo group by name
行转列查询
?
1
select * from (select name, nums from demo) pivot (sum(nums) for name in ('苹果' 苹果, '橘子', '葡萄', '芒果'));
注意: pivot(聚合函数 for 列名 in(类型)) ,其中 in(‘’) 中可以指定别名,in中还可以指定子查询,比如 select distinct code from customers
当然也可以不使用pivot函数,等同于下列语句,只是代码比较长,容易理解
?
12
select * from (select sum(nums) 苹果 from demo where name='苹果'),(select sum(nums) 橘子 from demo where name='橘子'), (select sum(nums) 葡萄 from demo where name='葡萄'),(select sum(nums) 芒果 from demo where name='芒果');
unpivot 行转列
顾名思义就是将多列转换成1列中去
案例:现在有一个水果表,记录了4个季度的销售数量,现在要将每种水果的每个季度的销售情况用多行数据展示。
创建表和数据
?
1234567
create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int); insert into Fruit values(1,'苹果',1000,2000,3300,5000);insert into Fruit values(2,'橘子',3000,3000,3200,1500);insert into Fruit values(3,'香蕉',2500,3500,2200,2500);insert into Fruit values(4,'葡萄',1500,2500,1200,3500);select * from Fruit
列转行查询
?
1
select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
注意: unpivot没有聚合函数,xiaoshou、jidu字段也是临时的变量
1、首先,需要向表中添加一列或多列。
2、其次,需要指定要添加新列的表的名称。
3、最后,指定列名,数据类型及其约束即可。
你这个应该是一张通用的表吧,就是说下面还有可能出现,诸如id=10002或者10003等。
如果这样的话,就用row_number()over(partition
by
id),进行排序,然后把排序后的再进行转换。
比如上面这个就是
select
row_number()over(partition
by
id)
id_id,id,countnum
from
table
这样会出来结果,如下
id_id
id
countnum
1
10001
30
2
10001
40
3
10001
50
1
10002
20
2
10002
50
3
10002
30
上面的结果没有排序,也可以按照countnum进行排序,就是在partition
by
id的后面加一个orderby,看你用不用了。
然后再对这个结果进行行列转换,用case
when就行,我假设上张表取别名为a
那么
select
id,(case
when
id_id=1
then
countnum
end)
column1,,(case
when
id_id=2
then
countnum
end)
column2,(case
when
id_id=3
then
countnum
end)
column3,(case
when
id_id=4
then
countnum
end)
column3,........from
a
不过这种写法有一个问题,就是必须写一个最长的,不然你就有数据不能显示出来。
如果只有一个10001,那么可以利用rownum直接编组。