2017-03-14 3 views
2

Meine Tabelle zu berechnen Einkommen ist wieBrauchen Unterabfrage zu schreiben für jeden Monat

summa_som  date_operation 
    -----  -------------- 
    100  11/03/2005 
    500  13/07/2008 
    900  12/11/2015 

Erwartetes Ergebnis

Ich möchte für jeden Monat berechnen Einkommen dort sollte 3 Spalten: Einkommen, Monat und Jahr:

Income  Month  Year 
------  --------  ---- 
10000  February  2015  
15000  December  2015 

Ich habe das versucht, aber ich verstehe nicht gut, wie Unterabfragen arbeiten. Dieser Code sollte eine Vorstellung davon, was ich will:

select max(summa_som * 0.01) income 
from t_operation 
where to_char(date_operation,'MM') = 11 
and to_char(date_operation,'YYYY') = 2015 
(select max(summa_som * 0.01) income_for_dec2015 from t_operation 
where to_char(date_operation,'MM') = 12 
and to_char(date_operation,'YYYY') = 2015) 

Antwort

3

Sie Filter und Aggregation verwenden können, dies zu erreichen:

select to_char(date_operation, 'Month') as mn, 
    to_char(date_operation, 'YYYY') as yr, 
    max(summa_som) * 0.01 as income 
from t_operation 
where date_operation >= date '2015-11-01' 
    and date_operation < date '2016-01-01' 
group by to_char(date_operation, 'Month'), 
    to_char(date_operation, 'YYYY') 

Wenn Sie Ergebnis aller Monate und Jahre wollen, für die die Daten vorhanden, können Sie den Filterzustand entfernen.

+0

Vielen Dank – vesperkg

0

Sie haben einige spezifische Formatierungsbedenken mit Datum und etwas, das mit dem Einkommen fortfährt, indem Sie es mit 0.01 multiplizieren. Wenn Sie Formatierungsbedenken wie diese haben, bevorzuge ich die Aggregation in einer inneren Abfrage basierend auf den betroffenen Datentypen, wobei die Zahlen als Zahlen und Datumsangaben beibehalten werden, sogar wenn sie für die Gruppierung als Datumsangaben modifiziert werden. Umschließen Sie dann die Anweisung mit einer äußeren Abfrage, die Typkonvertierungen oder Formatierung verarbeitet.

select (income*0.01) as income_value, 
     to_char(income_mn,'Month') as income_month, 
     to_char(income_mn,'YYYY') as income_year 
from (
     select trunc(date_operation,'MON') as income_mn, 
      max(summa_som) as income 
     from t_operation 
     where date_operation between to_date('11/2015','MM/YYYY') 
           and to_date('01/2016','MM/YYYY') - numtodsinterval(1, 'SECOND') 
     group by trunc(date_operation,'MON') 
    ); 

Hinweis: die Verwendung von zwischen macht die oberen und unteren gebundenen Werte inklusive. Ich habe eine Sekunde von der oberen Grenze subtrahiert, um nur die Dezember-Werte aufzunehmen, aber das ist nicht wirklich notwendig, es sei denn, Sie wollen nur Werte von 2015.

Verwandte Themen