Добавьте столбцы роста к этой таблице в sqlite - PullRequest
0 голосов
/ 16 октября 2018

У меня есть эта таблица Sales в базе данных sqlite3.

Name    Sales       Date
"Vent"  "75.998"    "2014-12-31"
"Vent"  "153.988"   "2015-12-31"
"Vent"  "180.678"   "2016-12-31"
"Vent"  "372.819"   "2017-12-31"
"DBG"   "4046.0"    "2014-12-31"
"DBG"   "4454.0"    "2015-12-31"
"DBG"   "4238.0"    "2016-12-31"
"DBG"   "4371.0"    "2017-12-31"

Я хотел бы добавить дополнительные столбцы в эту таблицу, чтобы показать рост продаж.Новая таблица будет выглядеть примерно так:

Name    Sales       Date          Year1_Growth      Year2_Growth        Year3_Growth
"Vent"  "75.998"    "2014-12-31"  null              null                null 
"Vent"  "153.988"   "2015-12-31"  153.988/75.998    null                null
"Vent"  "180.678"   "2016-12-31"  180.678/153.988   180.678/75.998      null
"Vent"  "372.819"   "2017-12-31"  372.819/180.678   372.819/153.988     372.819/75.998
"DBG"   "4046.0"    "2014-12-31"  null              null                null 
"DBG"   "4454.0"    "2015-12-31"  4454/4046         null                null 
"DBG"   "4238.0"    "2016-12-31"  4238/4454         4238/4046           null 
"DBG"   "4371.0"    "2017-12-31"  4371/4238         4371/4454           4371/4046          

Любые советы о том, как начать работу с кодом SQL?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Мы можем достичь этого через серию самостоятельных соединений.Обратите внимание, что в приведенном ниже запросе я распечатываю текстовые коэффициенты продаж.Это должно помочь вам подтвердить, что логика в запросе верна.Если вам нужны фактические числовые отношения, просто используйте, например, s1.Sales / s2.Sales вместо конкатенации строк.

SELECT
    s1.Name,
    s1.Sales,
    s1.Date,
    s1.Sales || '/' || s2.Sales AS first,      -- use s1.Sales / s2.Sales
    s1.Sales || '/' || s3.Sales AS second,     -- for actual ratio
    s1.Sales || '/' || s4.Sales AS third
FROM Sales s1
LEFT JOIN Sales s2
    ON s1.Name = s2.Name AND
       CAST(SUBSTR(s1.Date, 1, 4) AS int) = CAST(SUBSTR(s2.Date, 1, 4) AS int) + 1
LEFT JOIN Sales s3
    ON s1.Name = s3.Name AND
       CAST(SUBSTR(s1.Date, 1, 4) AS int) = CAST(SUBSTR(s3.Date, 1, 4) AS int) + 2
LEFT JOIN Sales s4
    ON s1.Name = s4.Name AND
       CAST(SUBSTR(s1.Date, 1, 4) AS int) = CAST(SUBSTR(s4.Date, 1, 4) AS int) + 3
ORDER BY
    s1.Name, s1.Date;

enter image description here

Demo

0 голосов
/ 16 октября 2018

Если вы используете Sqlite 3.25 или новее, объединения могут быть исключены, и это можно сделать очень просто, используя оконные функции:

SELECT name
     , sales
     , date
     , sales / lag(sales, 1) OVER past_sales AS Year1_Growth
     , sales / lag(sales, 2) OVER past_sales AS Year2_Growth
     , sales / lag(sales, 3) OVER past_sales AS Year3_Growth
FROM sales
WINDOW past_sales AS (PARTITION BY name ORDER BY date)
ORDER BY name DESC, date;

дает

name        sales       date        Year1_Growth  Year2_Growth  Year3_Growth
----------  ----------  ----------  ------------  ------------  ------------
Vent        75.998      2014-12-31  null          null          null        
Vent        153.988     2015-12-31  2.0262112160  null          null        
Vent        180.678     2016-12-31  1.1733251941  2.3774046685  null        
Vent        372.819     2017-12-31  2.0634443595  2.4210912538  4.9056422537
DBG         4046.0      2014-12-31  null          null          null        
DBG         4454.0      2015-12-31  1.1008403361  null          null        
DBG         4238.0      2016-12-31  0.9515042658  1.0474542758  null        
DBG         4371.0      2017-12-31  1.0313827277  0.9813650651  1.0803262481

Редактировать:Дамп схемы таблицы данных и данных:

CREATE TABLE sales(name TEXT, sales REAL, date TEXT);
INSERT INTO sales VALUES('Vent',75.99800000000000466,'2014-12-31');
INSERT INTO sales VALUES('Vent',153.98799999999999954,'2015-12-31');
INSERT INTO sales VALUES('Vent',180.67799999999999727,'2016-12-31');
INSERT INTO sales VALUES('Vent',372.81900000000001683,'2017-12-31');
INSERT INTO sales VALUES('DBG',4046.0,'2014-12-31');
INSERT INTO sales VALUES('DBG',4453.9999999999999999,'2015-12-31');
INSERT INTO sales VALUES('DBG',4238.0000000000000001,'2016-12-31');
INSERT INTO sales VALUES('DBG',4370.9999999999999999,'2017-12-31');
0 голосов
/ 16 октября 2018

Вы можете использовать join s:

select s.*,
       s.sales / nullif(s_1.sales, 0) as year1_growth,
       s.sales / nullif(s_2.sales, 0) as year2_growth,
       s.sales / nullif(s_3.sales, 0) as year3_growth
from sales s left join
     sales s_1
     on s.name = s_1.name and
        strftime('%Y', s.date) = stftime('%Y', s_1.date) + 1 left join
     sales s_2
     on s.name = s_2.name and
        strftime('%Y', s.date) = stftime('%Y', s_2.date) + 2 left join
     sales s_3
     on s.name = s_3.name and
        strftime('%Y', s.date) = stftime('%Y', s_3.date) + 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...