前言:报表是根据地区归属分为多个excel表格来填写的。而有些归属地的表格可能
根据报表统计无数据。但为了sql查询与excel表格一一匹配对应;这样填充
报表时可以顺序进行,不用交叉检查匹配,节省了大量时间;但如何令未
查询出来的归属也在sql查询中显示一行呢;
正文:
--构建测试 a为归属地 b为指标
SQL> create table t_match(a varchar2(100),b int);
Table created
--插入示例数据
SQL> insert into t_match values('渭南市',1);
1 row inserted
SQL> insert into t_match values('宝鸡市',2);
1 row inserted
SQL> insert into t_match values('咸阳市',3);
1 row inserted
SQL> insert into t_match values('商洛市',4);
1 row inserted
SQL> commit;
Commit complete
--查看示例表数据
SQL> select * from t_match;
A B
-------------------------------------------------------------------------------- ---------------------------------------
渭南市 1
宝鸡市 2
咸阳市 3
商洛市 4
--实现的效果大致如下:
A B
---------------------
渭南市 1
咸阳市 3
汉中市 NULL
商洛市 4
宝鸡市 2
--分析
1,按指定的列值排序,可采用order bydecode(a,'',1,'',2)
2, 如何把汉中市合并显示在查询结果中
3,看这个样子,一个表难以实现;借助中间表,
此表结构为:
create table t_map(a varchar2(100),orig_col int);
create sequence seq_map start with 1;
insert into t_map values('渭南市',seq_map.nextval);
insert into t_map values('咸阳市',seq_map.nextval);
insert into t_map values('汉中市',seq_map.nextval);
insert into t_map values('商洛市',seq_map.nextval);
insert into t_map values('宝鸡市',seq_map.nextval);
commit;
--运行符合查询结果的sql
select t_map.a,
t_match.b
from t_match,
t_map
where t_match.a(+)=t_map.a
order by t_map.orig_col;
--附上最终运行结果
SQL> select t_map.a,
2 t_match.b
3 from t_match,
4 t_map
5 where t_match.a(+)=t_map.a
6 order by t_map.orig_col;
A B
-------------------------------------------------------------------------------- ---------------------------------------
渭南市 1
咸阳市 3
汉中市
商洛市 4
宝鸡市 2
--如果仅是单表且报表表样的excel表格不太多的情况下
--此法的优点:不用创建中间表
缺点:可能有些归属地查询无结果,与报表表样不一一对应,需要部分进行核对填写,稍多费一点人力
可采用如下sql
select a,b
from t_match
order by decode(a,'渭南市',1,'咸阳市',2,'汉中市',3,'商洛市',4,'宝鸡市',5);
小结:1,中间表
2,左连接
3,order by
4,decode
5,decode转换值各为序列值1,2,3
6,序列(其实与5道理相同)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-755293/ ,如需转载,请注明出处,否则将追究法律责任。