2016-06-10 9 views
1

Ich versuche, einige Durchschnittswerte in den letzten 12 Monaten zu zeigen, aber es gibt keine Daten für Juni/Juli, also möchte ich die Titel für die Monate anzeigen, aber nur 0 in der 3 SpaltenOracle - Zeige 0, wenn keine Daten für den Monat

derzeit nur ist zeigen AUGUST-MAI die 10 Reihen sind so es Formeln und Diagramme Abwerfen usw.

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; 

Antwort

1

Diese Abfrage ist ziemlich gut, es ist nicht weit von der Arbeit.

Sie müssten den Monatentabellenabschnitt ersetzen. Sie möchten genau eine Zeile pro Monat, unabhängig davon, ob in der Tabelle ec Daten vorhanden sind.

Sie könnten vielleicht einige Daten synthetisieren, ohne zu irgendeiner tatsächlichen Tabelle in Ihrem eigenen Schema zu gehen.

Zum Beispiel:

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; 

gibt:

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 

Option 1: Schreiben Sie, dass subselect inline in Ihre Abfrage, sysdate mit dem Startmonat und die Zahl 12 in der letzten Zeile ersetzen kann geändert für die Anzahl von Monaten, die Sie in der Reihe wünschen.

Option 2 (kann in verschiedenen Situationen und Abfragen bequemer wiederverwendet werden): Schreiben Sie eine Ansicht mit einer langen Reihe von Monaten (z. B. Jan 1970 bis Dez 2199), indem Sie meine obige SQL-Anweisung verwenden. Sie können diese Ansicht dann in join_date mit den gewünschten Start- und Endmonaten verknüpfen. Es gibt Ihnen eine Zeile pro Monat und Sie können das formatierte Datum von seiner Spalte abholen.

Verwandte Themen