2017-10-28 2 views
0

Ich habe eine Tabelle, die so ist.Summe Umsatz und kauft bei gleicher Rekordgruppe nach Monat?

id date  subtotal type 
1 |2017-12-12 | 50.00 | 1 
2 |2017-12-12 | 20.00 | 2 
3 |2017-11-12 | 30.00 | 2 
4 |2017-11-12 | 40.00 | 1 
5 |2017-10-12 | 70.00 | 1 
6 |2017-10-12 | 250.00| 2 

In diesem Fall zeigt die Spalte type sales (1) und buy (2) an. Was ich machen möchte ist, nach diesen Bestellungen nach Monat zu gruppieren und den Gesamtverkauf zu erhalten und in diesem Monat zu kaufen. Etwas wie das.

id date  sale  buy 
1 |December | 50.00 | 20.00 
2 |November | 30.00 | 40.00 
3 |October | 70.00 | 250.00 

Wenn ich versuche, so etwas wie dieses,

select to_char(date,'Mon') as Month, 
     extract(year from date) as Year, 
     case when type= 1 then sum("subtotal") END as sales, 
     case when type= 2 then sum("subtotal") END as buys 
    from table 
    group by 1,2,type 

Ergebnis sieht nicht so aus, was ich will. Die Monate erscheinen in verschiedenen Spalten. So was.

month year sales buys 
Oct |2017| 70.00 | 0 
Oct |2017| 0  | 250.00 

Wie kann ich das erreichen? Ich will nur monatliche Summensätze.

Antwort

1

Sie wollen bedingte Aggregation:

select to_char(date,'Mon') as Month, 
     extract(year from date) as Year, 
     sum(case when type = 1 then subtotal else 0 end) as sales, 
     sum(case when type = 2 then subtotal else 0 end) as buys 
from table 
group by Month, Year; 

ich es oft bequem finden date_trunc() in dieser Situation zu verwenden, :

select date_trunc('month', date) as month_start, 
     sum(case when type = 1 then subtotal else 0 end) as sales, 
     sum(case when type = 2 then subtotal else 0 end) as buys 
from table 
group by month_start 
order by month_start; 
+0

Die erste funktioniert genau so, wie ich will. Vielen Dank. Ich bekomme den zweiten Gedanken nicht. Es gibt nur einen Wert. – mext

0

In Ihrer Abfrage gruppieren Sie auch nach Jahr, deshalb wird alles in derselben Zeile zusammengefasst. Dies sollte Sie geben, was Sie wollen:

select to_char(date,'Mon') as Month, 
     extract(year from date) as Year, 
     case when type= 1 then sum("subtotal") END as sales, 
     case when type= 2 then sum("subtotal") END as buys 
    from table 
    group by 1 
+0

es sagt, Spalte "table.date" muss in der GROUP BY-Klausel oder in einer Aggregatfunktion verwendet werden. – mext

+0

Mein Problem, Sie können die Jahresspalte auch in die Gruppenklausel aufnehmen, Sie brauchen den Typ einfach nicht. –

0

können Sie versuchen, diese

Select a.Month,a.Year,sum(a.sales) sales,sum(a.buys) buys 
from ( 
    select convert(char(3),date, 0) as Month, 
     year(date) as Year, 
     isnull(case when type= 1 then sum(subtotal) END,0) as sales, 
     isnull(case when type= 2 then sum(subtotal) END,0) as buys  
    from _table  
    group by convert(char(3),date, 0),year(date),type 
) a 
group by a.Month,a.Year 
+0

Ich bekomme Syntaxfehler auf diesem. Auch habe ich nicht a.sales und a.buys am Anfang. Ich habe nur Zwischensumme, die ich in Verkäufe umwandelte und vom Typwert kauft. – mext

+0

In Postgres gibt es kein 'convert()'. –

Verwandte Themen