Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlite中将增长列添加到此表_Sql_Sqlite - Fatal编程技术网

在sqlite中将增长列添加到此表

在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"

我在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代码的任何提示?

您可以使用连接:

您可以使用连接:


我们可以通过一系列的自连接来实现这一点。请注意,在下面的查询中,我实际上打印了销售数字的文本比率。这将帮助您确认查询中的逻辑是正确的。如果您想要实际的数字比率,那么只需使用例如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提供的答案。这是新事物。