今天做一张报表,遇到了两个问题
1.查询的那个表名是根据时间变化的。比如我现在要查询2015年的数据,我应该查询的表名是A2015apple 这张表 , 但是2015年一过,A2015apple这张表的数据就被封存起来了,到2016年,就会新建一张表A2016apple,所以我查询的表名A2016apple这张表了,当然,有一个前提,就是查询的时候不会跨年查询。所以,表名应该根据前台选择的日期来动态变化。当然,这里必须用到java代码来支持,因为oracle是不支持动态的sql的,除非是写一个函数或者存储过程。
String tableName = "A"+date2.substring(0, 4)+"apple"; 先把这个表名表示出来
“select fbendbal from " +tableName+
" where facctcode = '117000001' and fmonth = "+dbl.sqlMonth1(date2)+ "
开始的时候尝试着用很多sql函数来拼接表名,最终都失败了,最后在网上看到了这个思路。
2.遇到的第二个问题就是,我有两张表,我想用表1 的money字段减去表2的money字段,看到这个逻辑的时候我想,这也太简单了。直接是select a.money - b.money as money from a,b where a.month=1 and b.month=1;就ok了 但是这里就有一个条件摆在这里 , 就是a表1月份和b表一月份都必须有数据,不然查出来就是没有结果集的。在这里,一个新的需求就诞生了,那就是当b表1月份没有数据的时候,肯定就是算a表中的1月份的money了。
首先想到的就是用nvl()函数。但是要怎么写才能让nvl函数起作用呢,不多说,直接贴sql,这里要用到left join 如果不用这些链接的话 最终还是查不出结果的
select nvl(a.fbendbal,0) - nvl(b.fbendbal,0) as fmoney
from (select fbendbal
from A2015001lbalance
where facctcode = '117000001'
and fmonth =
to_number(to_char(to_date('2015-04-25', 'yyyy-mm-dd'), 'mm'))) a left join
(select fbendbal
from A2015002lbalance
where facctcode = '109'
and fmonth =
to_number(to_char(to_date('2015-04-25', 'yyyy-mm-dd'), 'mm'))) b on 1=1
nvl(a,0)的意思就是 当a的值为0的时候,表达式就是0 , 当a不为0的时候,表达式的值就是a
上面的b表本来是没有数据的,但是left join以后,其实就是外链接以后,就会把没有结果集的当做空来显示。就可以用nvl()函数把空显示为0 了 ,内链接在这方面是做不到。自己可以动手试一下