后台sql实现如下图的数据支撑(图横坐标数据要求为今天的前一天往前一个月的,纵坐标为对应天的数据)
select sum(total) total, to_char(dateL,'MM"月"DD"日"') dateL from (
select sum(RZL) total,zlrq dateL from sa.SJJK_RZL rzl where zlrq >=ADD_MONTHS(TRUNC(SYSDATE-1),-1)
and zlrq < TRUNC(SYSDATE)
group by zlrq
union all
(SELECT 0 total, TRUNC(SYSDATE)-LEVEL dateL FROM DUAL CONNECT BY LEVEL<=TRUNC(SYSDATE)-ADD_MONTHS(TRUNC(SYSDATE-1),-1)
)
)
group by dateL
order by dateL
分析下注意:
基础sql知识:
select trunc(sysdate, 'mm') from dual --2018/7/1 返回当月第一天.
select trunc(sysdate) from dual ---2018/7/2 今天的日期为-2018/7/2
LAST_DAY(DATE) 即 LAST_DAY(日期) LAST_DAY函数返回指定日期对应月份的最后一天。
connect by level 是oracle中一组关键字,是用来实现递归查询的,譬如说实现查询 1,2,3,4 .....n 的数字可以使用connect by level
举例
SQL语句如下:select level +1 from dual where connect by level <=10
这种方式可以实现查询1到n的数字,共有n行
ADD_MONTHS(TRUNC(SYSDATE),-1) 查询当前日期的前一个月的数据(比如今天是7月2号,这就是6月2号)
TRUNC(SYSDATE)-ADD_MONTHS(TRUNC(SYSDATE),-1) 两个日期的时间差为上述level 的 n,可以查到1到该时间差的行数
TRUNC(SYSDATE)-LEVEL,当前日期减去(查询1到n的数字,共有n行)得到往前的一段连续的日期。
to_char(dateL,'MM"月"DD"日"') 把查询出来的日期处理成想要的日期的格式。
UNION ALL 命令会列出上下所有的值
进入主题sql的Union all前半段是今天的昨天往前数一个月数据
后半段是 今天的昨天往前数30天,这个时间段的数据
所以把所有有值的日期都列出来了。