sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man beräknar månad över månad tillväxt i PostgreSQL

Tillväxt månad över månad är ett användbart affärsmått för jämförelse av försäljning, registreringar, etc. Vi kommer att beräkna månatlig procentuell tillväxt via SQL-fråga, eftersom det inte finns någon PostgreSQL-funktion för det. Så här beräknar du månadsvis tillväxt i PostgreSQL.

Hur man beräknar tillväxt från månad till månad i PostgreSQL

Anta att du har en tabell som innehåller månadsförsäljning som heter försäljningsdata(månad, rea)

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

Här är SQL-frågan för att beräkna månadsvis procentuell försäljningstillväxt i PostgreSQL.

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%

I ovanstående fråga använder vi LAG-fönsterfunktionen för att beräkna föregående månads försäljning och använder den för att beräkna månadsvis tillväxt i PostgreSQL. LAG låter dig hämta raden som kommer före den aktuella raden, med en definierad offset, som är 1 i vårt fall.

Bonus läsning: Hur man skapar pivottabell i PostgreSQL

I de flesta fall kommer du att ha dagliga försäljningsdata, istället för månadssiffror. I det här fallet aggregerar vi det först till månatliga försäljningssiffror och tillämpar sedan ovanstående SQL-fråga för att beräkna månadsvis tillväxt i PostgreSQL.

Låt oss säga att du har dagliga försäljningsdata.

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 |

Här är SQL-frågan för att beräkna månatlig tillväxttakt i PostgreSQL

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%

I ovanstående fråga aggregerar vi den dagliga försäljningsdatan till månadsvärden (i fetstil ) och använd sedan tidigare fråga.

Du kan också filtrera dina data med hjälp av en WHERE-klausul innan du beräknar tillväxt från månad till månad i PostgreSQL.

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;

När du har beräknat tillväxten månad för månad i PostgreSQL kan du använda ett rapportverktyg för att plotta denna data på ett stapeldiagram eller instrumentpanel och dela den med ditt team. Här är ett exempel på ett stapeldiagram som visar procentuell tillväxt från månad till månad, skapat med Ubiq.

Om du vill skapa diagram, instrumentpaneler och rapporter från PostgreSQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. SQL Group By med en Order By

  2. R DBI ODBC-fel:nanodbc/nanodbc.cpp:3110:07009:[Microsoft][ODBC-drivrutin 13 för SQL Server]Ogiltigt deskriptorindex

  3. Hur man jämför två tabeller i MySQL

  4. Hämta värden från första och sista raden per grupp