2016-12-30 1 views
0

Ich habe eine Verkaufstabelle und zwei verschiedene Datumsbereiche. ich habe einen Gesamtumsatz zwischen (2016-12-21 - 2016-12-30) is 100 und für Zeitraum (2016-12-11 - 2016-12-20) is 85. Jetzt das Ergebnis, das ich will, istDatensätze mit Unterschied zu 2 verschiedenen Datumsbereichen in einer einzigen Abfrage abrufen

100 (sales of 2016-12-21 - 2016-12-30), 85 (sales of 2016-12-11 - 2016-12-20), 15 (difference of both periods) durch einzelne Abfrage.

Was ich denke, ist

select *, (a.sales - b.sales) as diff 
from (select id, sum(sales) as sales from salestable where date >= '2016-12-21' and date <= '2016-12-30') a 
join (select id, sum(sales) as sales from salestable where date >= '2016-12-11' and date <= '2016-12-20') b 
on a.id = b.id; 

Gibt es eine andere bessere Möglichkeit, dies zu tun?

Antwort

1

können Sie bedingte Aggregation verwenden:

select sum(case when date >= '2016-12-21' and date <= '2016-12-30' then sales else 0 
      end) as sales_a, 
     sum(case when date >= '2016-12-11' and date <= '2016-12-20' then sales else 0 
      end) as sales_b, 
     sum(case when date >= '2016-12-21' and date <= '2016-12-30' 
       then sales else 0 
       when date >= '2016-12-11' and date <= '2016-12-20' 
       then -sales 
       else 0 
      end) as sales_diff 
from salestable; 

Wenn Sie die Gesamtsumme von id wollen (wie durch Ihre Aufnahme vorgeschlagen von id), dann füge id zu der select hinzu und füge group by id hinzu.

0

Sie können case verwenden, um eine bedingte Summe wie dies zu tun:

select id, 
    sum_21_to_30, 
    sum_11_to_20, 
    sum_21_to_30 - sum_11_to_20 diff 
from (select id, 
    sum(case when date >= '2016-12-21' and date <= '2016-12-30' then sales else 0 end) sum_21_to_30, 
    sum(case when date >= '2016-12-11' and date <= '2016-12-20' then sales else 0 end) sum_11_to_20 
from table group by id) t; 
Verwandte Themen