【问题标题】:Usage compared to last year与去年相比的使用情况
【发布时间】:2016-01-14 21:45:08
【问题描述】:

我有一个包含两列的表 - 日期和金额(使用情况)。我想将我的使用情况与去年的比较

数据

Date        Amount
01-01-2015  23
02-01-2015  24
03-01-2015  19
04-01-2015  11
05-01-2015  5
06-01-2015  23
07-01-2015  21
08-01-2015  6
09-01-2015  26
10-01-2015  9
[...]
01-01-2016  30
02-01-2016  19
03-01-2016  5
04-01-2016  8
05-01-2016  15
06-01-2016  27
07-01-2016  19
08-01-2016  21
09-01-2016  24
10-01-2016  27
[until today's date]

sql 语句应该返回到今天为止的结果,并且 diff 应该是一个运行总计 - 2016 年一天的金额减去 2015 年同一天的金额,再加上之前的差额。假设今天是 1 月 10 日,结果将是:

Day         Diff
01-01-2016  7   (30-23)
02-01-2016  2   (19-24+7)
03-01-2016  -12 (5-19+2)
04-01-2016  -15 (8-11-12)
05-01-2016  -5  (and so on...)
06-01-2016  -1
07-01-2016  -3
08-01-2016  12
09-01-2016  10
10-01-2016  28

当数据都在一个表中时,我无法弄清楚这样做......

谢谢

【问题讨论】:

  • 不幸的是,除非您使用存储过程(sqlite3 本身没有存储过程),否则保持运行总计是 SQL(任何类型的)不太擅长的一件事。在 MySQL 中,您也可以使用 @variables 来克服此限制,但一般情况下,您需要在此处使用外部过程语言。
  • 您可以通过在等于或小于日期的天数将表连接到自身并执行 sum() 来获得运行总计。您可以通过按日和月将一年的运行总和与下一年的运行总和相加来获得逐年比较。
  • @Rabbit 你能告诉我怎么做吗?
  • 这不是supported date formats 之一。
  • @something_new 到目前为止您尝试了什么?当有人没有尝试自己解决问题时,我没有发布完整代码的习惯。

标签: sql date sqlite


【解决方案1】:

试试这个

SELECT t1.date Day,SUM(t2.Diff) FROM
amounts t1
INNER JOIN
(SELECT amounts.date Day, amounts.amount-prevamounts.amount Diff
FROM amounts inner join amounts prevamounts 
ON amounts.date=date(prevamounts.date,'+1 years')) t2
ON t2.Day<=t1.date
group by t1.date;

在这里演示: http://sqlfiddle.com/#!7/9bd4c/41

【讨论】:

  • 不给出运行总数。根据其他用户的说法,可能不会只用 sqlite 来做
  • 你查看我制作的 sqlfiddle 演示了吗?它准确地返回了要求。请问有什么遗漏或错误?
  • 它没有准确地返回需求。请再次检查 OP 中的结果。你的第一行是正确的,后面的都是错误的。
  • @AtheerMostafa 列 Diff 应该是运行总计,而不仅仅是每月差异
  • @something_new 抱歉,我没有注意到累计总数。我现在更正了解决方案。您会重新检查并更新您的投票吗...谢谢您的评论
猜你喜欢
  • 2022-11-16
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多