Oracle - 如果没有月份数据,则显示0

时间:2016-06-10 00:18:46

标签: oracle

我试图显示过去12个月的一些平均值,但6月/ 7月没有数据,所以我想要显示月份的标题,但只有3列中的0?

目前它只显示8月 - 5月10行,所以它会丢掉公式和图表等。

    select to_char(Months.Period,'YYYY/MM') As Period, coalesce(avg(ec.hours_reset),0) as AvgOfHOURSReset, coalesce(AVG(ec.cycles_reset),0) as AvgofCycles_Reset, Coalesce(AVG(ec.days_reset),0) as AvgofDAYS_Reset
from (select distinct reset_date as Period from engineering_compliance
where reset_date between '01/JUN/15' and '31/MAY/16') Months
left outer join engineering_compliance ec on ec.reset_date = months.Period
WHERE EC.EO = 'AT CHECK'
group by to_char(Months.Period,'YYYY/MM')
order by to_char(Months.Period,'YYYY/MM')

;
(select distinct to_char(reset_date,'YYYY/MM') as Period from engineering_compliance
where reset_date between '01/JUN/15' and '31/MAY/16') Months;

1 个答案:

答案 0 :(得分:1)

该查询非常好,距离工作还不远。

您需要替换Months表部分。无论ec表中是否有任何数据,您每月只需要一行。

您可以合成一些数据,而无需访问自己架构中的任何实际表格。

例如:

SELECT
  extract(month from add_months(sysdate,level-1)) Row_Month,
  extract(year from add_months(sysdate,level-1)) Row_Year,
  to_char(add_months(sysdate,level-1),'YYYY/MM') Formatted_Date,
  trunc(add_months(sysdate,level-1),'mon') Join_Date
FROM dual
CONNECT BY level <= 12;

给出:

ROW_MONTH,ROW_YEAR,FORMATTED_DATE,JOIN_DATE
 6,2016,'2016/06',1/06/2016
 7,2016,'2016/07',1/07/2016
 8,2016,'2016/08',1/08/2016
 9,2016,'2016/09',1/09/2016
10,2016,'2016/10',1/10/2016
11,2016,'2016/11',1/11/2016
12,2016,'2016/12',1/12/2016
 1,2017,'2017/01',1/01/2017
 2,2017,'2017/02',1/02/2017
 3,2017,'2017/03',1/03/2017
 4,2017,'2017/04',1/04/2017
 5,2017,'2017/05',1/05/2017

选项1:将该子选择内联写入您的查询,将sysdate替换为开始月份,最后一行的数字12可以更改为系列中所需的月数。

选项2(可以在各种情况和查询中更方便地重复使用):使用上面的SQL编写一个长期连续几个月的视图(例如,1970年1月到2199年12月)。然后,您可以使用所需的开始和结束月份加入join_date上的该视图。它会每月为您提供一行,您可以从其列中选择格式化的日期。