SQL(sqlite)比较由另一个重复行分组的行的总和

时间:2016-07-12 19:36:28

标签: sql sqlite group-by sum

我有一张表:

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

我使用SELECT name, SUM(trees_planted) FROM year2016 GROUP BY name获取:

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)  

2 个答案:

答案 0 :(得分: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

这也适用于仅在两年中的一年中给出数字的情况。

答案 1 :(得分: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年拥有不同的用户组),则可以通过使用几个{{{}来轻松添加缺少的信息1}}条款。

这是指向SQLFIDDLE的人工数据链接以尝试查询。