在sqlite中将增长列添加到此表
我在sqlite3数据库中有这个销售表在sqlite中将增长列添加到此表,sql,sqlite,Sql,Sqlite,我在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"
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代码的任何提示?您可以使用连接:
您可以使用连接:
我们可以通过一系列的自连接来实现这一点。请注意,在下面的查询中,我实际上打印了销售数字的文本比率。这将帮助您确认查询中的逻辑是正确的。如果您想要实际的数字比率,那么只需使用例如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;
我们可以通过一系列的自连接来实现这一点。请注意,在下面的查询中,我实际上打印了销售数字的文本比率。这将帮助您确认查询中的逻辑是正确的。如果您想要实际的数字比率,那么只需使用例如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;
如果您使用的是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;
给予
编辑:转储示例表架构和数据:
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');
如果您使用的是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;
给予
编辑:转储示例表架构和数据:
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');
谢谢我不需要除数出现在列中。问题细节中的除数用于说明如何计算销售增长。我想显示除法的最终结果。@user3848207然后取s1.Sales/s2.Sales的比率。你的问题不清楚你到底想要什么。对不起,不清楚。谢谢你的回答。我把它标为正确答案。谢谢。我不需要除数出现在列中。问题细节中的除数用于说明如何计算销售增长。我想显示除法的最终结果。@user3848207然后取s1.Sales/s2.Sales的比率。你的问题不清楚你到底想要什么。对不起,不清楚。谢谢你的回答。我把它标为正确答案。你试过运行它吗?我不认为那些strftime比较会起作用,因为即使在修复了拼写错误strftime“%Y”,s.date返回一个字符串,而strftime“%Y”,s_1.date+1计算为一个数字,并且将一个字符串与一个数字进行相等比较总是失败的。你试过运行它吗?我认为这些strftime比较即使在修复了拼写错误strftime“%Y”,s.date返回一个字符串,而strftime“%Y”,s_1.date+1求值为一个数字,并且将字符串与数字进行相等比较总是失败的。感谢您使用Windows提供的答案。然而,我尝试了一下,却发现了错误。接近过去的销售:语法错误:选择名称、销售、日期、销售/滞后销售、1超过过去的销售我想知道这是否是由于不支持窗口功能造成的。但是,我已经使用sqlite3工具v3.25创建了一个新的数据库。我实际上是从3.25.2 sqlite3 shell复制和粘贴的。该查询不适用于3.25版本之前的库;如果您使用的是较旧的答案,则必须使用其他答案之一。我使用DB Browser运行了查询。我猜这个工具不支持3.25。因此,出现了错误。感谢您使用windows提供的答案。这是一个新问题。感谢您使用Windows提供的答案。然而,我尝试了一下,却发现了错误。接近过去的销售:语法错误:选择名称、销售、日期、销售/滞后销售、1超过过去的销售我想知道这是否是由于不支持窗口功能造成的。但是,我已经使用sqlite3工具v3.25创建了一个新的数据库。我实际上是从3.25.2 sqlite3 shell复制和粘贴的。该查询不适用于3.25版本之前的库;如果您使用的是较旧的答案,则必须使用其他答案之一。我使用DB Browser运行了查询。我猜这个工具不支持3.25。因此,出现了错误。感谢您使用windows提供的答案。这是新事物。