龙空技术网

oracle按日、月分组统计,缺少记录补为0

西红柿炖土豆 425

前言:

此刻大家对“oracle每个月1号”可能比较着重,大家都需要知道一些“oracle每个月1号”的相关内容。那么小编也在网摘上收集了一些有关“oracle每个月1号””的相关知识,希望我们能喜欢,看官们快快来学习一下吧!

oracle进行按照周统计或者月统计的时候,需要按天进行分组。

但是如果某一天没有数据的话,就会缺少某一天的数据。

基本思路都是用两个表关联,一个日期表,一个业务表,日期表展示日期,与业务表日期关联。

建表插入数据有些繁琐,这里我们可以虚拟一个。

实现方式:

SELECT  TO_CHAR(TO_DATE( '2022-01-01', 'YYYY-MM-DD') + ROWNUM - 1, 'YYYY-MM-DD') DAY_TIME FROM DUALCONNECT BY ROWNUM <= TO_DATE( '2022-02-01', 'YYYY-MM-DD') - TO_DATE( '2022-01-01', 'YYYY-MM-DD')

这样就得到一张日期表

查询结果如下:

单独根据日期对业务表进行查询如下:

select TO_CHAR(to_date(t.ORDER_DATE),'yyyy-mm-dd') as DAY_TIME,sum(t.DEAL_AMOUNT) as totalMoney from  BASE_ORDER t where t.dr = 0 and t.ORDER_DATE>= to_date('2022-01-01','YYYY-MM-DD')and t.ORDER_DATE<= to_date('2022-02-01','YYYY-MM-DD') GROUP BY to_date(t.ORDER_DATE) 

两张表进行关联

SELECT	to_date( a.day_time, 'YYYY-MM-DD' ),	nvl( b.totalMoney, 0 ) FROM	(	SELECT		TO_CHAR( TO_DATE( '2021-10-01', 'YYYY-MM-DD' ) + ROWNUM - 1, 'YYYY-MM-DD' ) DAY_TIME 	FROM		DUAL CONNECT BY ROWNUM <= TO_DATE( '2021-10-31', 'YYYY-MM-DD' ) - TO_DATE( '2021-10-01', 'YYYY-MM-DD' ) 	) a	LEFT JOIN (	SELECT		TO_CHAR( to_date( t.ORDER_DATE ), 'yyyy-mm-dd' ) AS DAY_TIME,		sum( t.TOTAL_DEAL_AMOUNT ) AS totalMoney 	FROM		BASE_ORDER t 	WHERE		t.dr = 0 		AND t.ORDER_DATE >= to_date( '2021-10-01', 'YYYY-MM-DD' ) 		AND t.ORDER_DATE <= to_date( '2021-10-31', 'YYYY-MM-DD' ) 	GROUP BY		to_date( t.ORDER_DATE ) 	) b ON a.day_time = b.day_time ORDER BY	a.day_time ASC

查询结果

如果按年分12个月,则先找到月份表

SELECT CONCAT('2021-',CONCAT(case when ROWNUM<10 then '0' else '' end, ROWNUM))  DAY_TIME FROM DUAL CONNECT BY ROWNUM <= 12

同样进行左关联

SELECT	to_date( a.day_time, 'yyyy-mm' ),	nvl( b.totalMoney, 0 ) FROM	(	SELECT	CONCAT( '2021-', CONCAT( CASE WHEN ROWNUM < 10 THEN '0' ELSE '' END, ROWNUM ) ) DAY_TIME FROM	DUAL CONNECT BY ROWNUM <= 12 	) a	LEFT JOIN (	SELECT		TO_CHAR( to_date( t.ORDER_DATE ), 'yyyy-mm' ) AS DAY_TIME,		sum( t.TOTAL_DEAL_AMOUNT ) AS totalMoney 	FROM		BASE_ORDER t 	WHERE		t.dr = 0 		AND t.ORDER_DATE >= to_date( '2021-01-01', 'yyyy-mm-dd' ) 		AND t.ORDER_DATE <= to_date( '2022-01-01', 'yyyy-mm-dd' ) 	GROUP BY		TO_CHAR( to_date( t.ORDER_DATE ), 'yyyy-mm' ) 	) b ON a.day_time = b.day_time ORDER BY	a.day_time ASC

查询结果

标签: #oracle每个月1号