sql >> Database >  >> RDS >> PostgreSQL

Hoe de groei van maand tot maand in PostgreSQL te berekenen?

Maand-op-maand-groei is een nuttige zakelijke KPI voor maand-op-maand vergelijking van verkopen, aanmeldingen, enz. We zullen de maandelijkse procentuele groei berekenen via SQL-query, aangezien er geen PostgreSQL-functie voor is. Hier leest u hoe u de groei van maand tot maand in PostgreSQL kunt berekenen.

Hoe de groei van maand tot maand in PostgreSQL te berekenen

Stel dat u een tabel heeft met maandelijkse verkopen genaamd sales_data(month, sale)

postgres=# create table sales_data(month int,sale int);

postgres=# insert into sales_data(month,sale) values(1,2021),
           (2,2102),(3,2150),(4,2312),(5,2425);

postgres=# select * from sales_data;
 month | sale
-------+------
     1 | 2021
     2 | 2102
     3 | 2150
     4 | 2312
     5 | 2425

Hier is de SQL-query om de procentuele groei van de verkoop in PostgreSQL van maand tot maand te berekenen.

postgres=# select month,sum(sale) as current_sale,
                lag(sum(sale), 1) over (order by month) as previous_month_sale,
                (100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
                (order by month)) || '%' as growth
                from sales_data
                group by 1
                order by 1;
 month | current_sale | previous_month_sale | growth
-------+--------------+---------------------+--------
     1 |         2021 |                     |
     2 |         2102 |                2021 | 4%
     3 |         2150 |                2102 | 2%
     4 |         2312 |                2150 | 7%
     5 |         2425 |                2312 | 4%

In de bovenstaande query gebruiken we de LAG-vensterfunctie om de verkopen van de vorige maand te berekenen en om de groei van maand tot maand in PostgreSQL te berekenen. Met LAG kunt u de rij ophalen die vóór de huidige rij komt, met een gedefinieerde offset, wat in ons geval 1 is.

Lees bonus: Hoe maak je een draaitabel in PostgreSQL

In de meeste gevallen heeft u dagelijkse verkoopgegevens in plaats van maandelijkse cijfers. In dit geval aggregeren we het eerst tot maandelijkse verkoopcijfers en passen we vervolgens de bovenstaande SQL-query toe om de groei van maand tot maand in PostgreSQL te berekenen.

Stel dat u dagelijkse verkoopgegevens heeft.

postgres=# create sales (order_date date, sale int);

postgres=# insert into sales values('2020-01-01',20),
           ('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
           ('2020-02-05',20),('2020-02-10',20),('2020-02-06',25),
           ('2020-03-07',15),('2020-03-08',30),('2020-03-09',20);

postgres=# select * from sales;
 order_date | sale | 
------------+------+
 2020-01-01 |   20 |
 2020-01-02 |   25 |
 2020-01-03 |   15 |
 2020-01-04 |   30 |
 2020-02-05 |   20 |
 2020-02-10 |   20 |
 2020-02-06 |   25 |
 2020-03-07 |   15 |
 2020-03-08 |   30 |
 2020-03-09 |   20 |

Hier is de SQL-query om de maandelijkse groeisnelheid in PostgreSQL te berekenen

postgres=# select month,sum(sale) as current_sale,
           lag(sum(sale), 1) over (order by month) as previous_month_sale,
           round((100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
           (order by month)),2) || '%' as growth
           from (select to_char(order_date,'Mon') as month,
           sum(sale) as sale
           from sales
           group by 1 ) sales_data
           group by 1
           order by 1;
 month | current_sale | previous_month_sale | growth
-------+--------------+---------------------+---------
 Feb   |           65 |                     |
 Jan   |           90 |                  65 | 38.46%
 Mar   |           65 |                  90 | -27.78%

In de bovenstaande zoekopdracht voegen we de dagelijkse verkoopgegevens samen tot maandelijkse waarden (in vet ) en gebruik dan een eerdere zoekopdracht.

U kunt uw gegevens ook filteren met behulp van een WHERE-clausule voordat u de groei van maand tot maand in PostgreSQL berekent.

postgres=# select month,sum(sale) as current_sale,
           lag(sum(sale), 1) over (order by month) as previous_month_sale,
           round((100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
           (order by month)),2) || '%' as growth
           from (select to_char(order_date,'Mon') as month,
           sum(sale) as sale
           from sales 
           WHERE condition
           group by 1 ) sales_data
           group by 1
           order by 1;

Nadat u de groei van maand tot maand in PostgreSQL hebt berekend, kunt u een rapportagetool gebruiken om deze gegevens in een staafdiagram of dashboard uit te zetten en met uw team te delen. Hier is een voorbeeld van een staafdiagram dat de procentuele groei van maand tot maand laat zien, gemaakt met Ubiq.

Als u grafieken, dashboards en rapporten wilt maken vanuit de PostgreSQL-database, kunt u Ubiq proberen. We bieden een gratis proefperiode van 14 dagen aan.

  1. XML-tabel met Oracle 11g

  2. Equivalent van explode() om te werken met strings in MySQL

  3. varchar2(n BYTE|CHAR) standaard -> CHAR of BYTE

  4. RStudio verbinden met SQL Server