2016-07-12 14 views
2

我有一個表,如:我使用的是SELECT name, SUM(trees_planted) FROM year2016 GROUP BY nameSQL(SQLite的)比較另一個重複的行分組的行的總和

|------------------------| 
|day name trees_planted| 
|------------------------| 
|1 | alice | 3   | 
|2 | alice | 4   | 
|1 | bob | 2   | 
|2 | bob | 4   | 
|------------------------| 

獲得:

name | trees_planted 
alice | 7 
bob | 6 

但後來我有另一個表從2015年開始,我想比較一下上一年的結果,例如,如果愛麗絲2016年種植的樹數比2015年多,我會得到如下結果:

name | tree_difference 
alice | -2 (if previous year she planted 5 trees, 5 -7 = -2) 
bob | 0 (planted the same number of trees last year) 

回答

0

假設你可以加入使用user場,你可以這樣做:

select a.name, a.tp, b.tp, a.tp - b.tp 
    from 
    (
     (select name, SUM(trees_planted) tp from year2016 group by name) a 
    inner join 
     (select name, SUM(trees_planted) tp from year2015 group by name) b 
    using(name) 
    ) 

如果你不能在現場user加入(必須在2015年和2016年不同的用戶組),這將是很容易添加缺少的信息通過使用union條款。

這裏有一個人工數據鏈接到SQLFIDDLE來嘗試查詢。

+1

嘿,它的工作,我不明白爲什麼,但我會玩你的答案,看看我是否得到它,我也必須查找'使用'關鍵字,我第一次看到它。非常感謝你。 – userian

+0

很高興有用@userian。也看看trincot的答案。它有不同的方法,但它也可能適用於你。 –

1

你可以使用子查詢來獲取來自2016和2015年的記錄,但是從2016年之後組否定值和已經總結像你這樣:

SELECT name, 
      SUM(trees_planted) AS tree_difference 
FROM  (SELECT name, trees_planted 
      FROM year2015 
      UNION ALL 
      SELECT name, -trees_planted 
      FROM year2016 
     ) AS years 
GROUP BY name 

這也將爲情況下工作一個數字只在兩年中的一箇中給出。

+0

嗯,這也適用,在運行「UNION ALL」的部分後,我明白了爲什麼,我只知道UNION,而且第一次在終端上寫這個,我得到了零,因爲我錯過了ALL。謝謝。 – userian

+0

是的,「ALL」是必需的,否則「重複」就會被消除,但在這種情況下這將是一個不希望的結果。請注意,如果某些人只有2015年的數據,而不是2016年的數據,那麼您仍然會得到該人的結果。 2016年只有數據時也是如此。 – trincot

相關問題