2017-07-20 16 views
0
SELECT date_trunc('month', dateordered), SUM(orders) - (
SELECT SUM(orders) 
FROM c_orders 
WHERE orderstatus = 'returned' 
) 
FROM c_orders 
WHERE orderstatus = 'complete' 
GROUP BY 1 

die mir die folgende Ausgabe gibt:berechnen Monat-over-Monats-Wachstum in Prozent in SQL

date_trunc total_orders 
2016-08-01 00:00:00 129 
2016-09-01 00:00:00 125 
2016-10-01 00:00:00 160 
2016-11-01 00:00:00 202 
2016-12-01 00:00:00 357 

Ich möchte den Monat-für-Monat prozentuale Veränderung berechnen, im August beginnen. Wie kann ich das in meiner SQL-Abfrage tun?

TIA

Antwort

1

Warum verwenden Sie diese Abfrage? Das ist viel einfacher:

SELECT date_trunc('month', dateordered) as yyyymm, 
     SUM(CASE WHEN orderstatus = 'returned' THEN orders 
       WHEN orderstatus = 'complete' THEN - orders 
       ELSE 0 
      END) as net 
FROM c_orders 
GROUP BY yyyymm 
ORDER BY yyyymm; 

Dann wird Ihre Frage einfach mit beantwortet lag():

WITH o as (
     SELECT date_trunc('month', dateordered) as yyyymm, 
      SUM(CASE WHEN orderstatus = 'returned' THEN orders 
         WHEN orderstatus = 'complete' THEN - orders 
         ELSE 0 
        END) as net 
     FROM c_orders o 
     GROUP BY yyyymm 
    ) 
SELECT o.*, 
     (net/LAG(net) OVER (ORDER BY yyyymm) - 1) as net_change 
FROM o 
ORDER BY yyyymm; 

Um die Daten seit 2016-08 zu erhalten, können Sie eine weitere Ebene von Unterabfragen müssen:

SELECT o.* 
FROM (SELECT o.*, 
      (net/LAG(net) OVER (ORDER BY yyyymm) - 1) as net_change 
     FROM o 
    ) o 
WHERE yyyymm >= '2016-08-01' 
ORDER BY yyyymm; 
0

Sie LAG() können total_orders aus vorherigen Zeile für Prozentrechnung

with total_orders(date_trunc,total_orders) as (
    values 
('2016-08-01 00:00:00' ,129) 
,('2016-09-01 00:00:00' ,125) 
,('2016-10-01 00:00:00' ,160) 
,('2016-11-01 00:00:00' ,202) 
,('2016-12-01 00:00:00' ,357)  
) 
,with_base as (select *,(lag(total_orders,1,0) over (ORDER BY date_trunc)) 
from total_orders) 
select date_trunc 
     , total_orders 
     , (case when 0 = lag 
       then 0 
       else total_orders/lag::FLOAT * 100 end)::INT as percent 
from with_base; 

Ergebnis auszuwählen:

date_trunc   total_orders percent 
"2016-08-01 00:00:00",129   ,0 
"2016-09-01 00:00:00",125   ,97 
"2016-10-01 00:00:00",160   ,128 
"2016-11-01 00:00:00",202   ,126 
"2016-12-01 00:00:00",357   ,177