2016-01-14 37 views
0

我有一個表,其中包含兩列 - 日期金額(使用情況)。我想比較我與去年與去年相比的用法

數據

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語句應該返回結果到今天的日期和差異應該是總運行 - 在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 

我想不出這樣做時,數據都在一個表...

感謝

+1

不幸的是,保持運行的時候,總是一件事SQL(任何類型)不是很好,除非你使用存儲過程(sqlite3本身沒有)。在MySQL中,你也可以使用@variables來克服這個限制,但是一般來說,你需要在這裏使用外部過程語言。 – barrycarter

+0

您可以通過在日期等於或小於日期並執行總和()的情況下將表加入自身來獲得運行總額。通過將日期和月份的一年運行總數加入下一年的運行總和,您可以獲得逐年比較。 – Rabbit

+0

@Rabbit你能告訴我怎麼做? –

回答

2

試試這個

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

+0

不給出運行總數。根據其他用戶,可能不會僅僅使用sqlite –

+0

您是否檢查過我製作的sqlfiddle演示程序?它完全返回需求。請問是什麼遺漏或錯誤? –

+1

它不完全返回需求。請再次檢查OP中的結果。你的第一排是正確的,在錯誤之後的一切都是正確的。 – Rabbit