2016-07-12 13 views
2

Ich habe eine Tabelle wie:SQL (SQLite) vergleichen Summen der Zeilen durch eine andere sich wiederholende Reihe gruppiert

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

ich SELECT name, SUM(trees_planted) FROM year2016 GROUP BY name bin mit zu bekommen:

name | trees_planted 
alice | 7 
bob | 6 

Aber dann habe ich eine andere Tabelle von 2015 und ich möchte die Ergebnisse mit dem Vorjahr vergleichen, wenn zum Beispiel Alice im Jahr 2016 mehr Bäume gepflanzt hätte als im Jahr 2015 würde ich ein Ergebnis wie folgt erhalten:

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) 

Antwort

0

Angenommen, Sie können mit user Feld verbinden, die Sie tun können:

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) 
    ) 

Wenn Sie nicht auf dem Feld beitreten können user (Sie andere Gruppe von Benutzern im Jahr 2015 und 2016 haben), wird es leicht zu addieren sein die fehlenden Informationen mit ein paar Klauseln.

Hier ist eine Verbindung mit künstlichen Daten zu SQLFIDDLE, um die Abfrage zu versuchen.

+1

Hey, es hat funktioniert, ich verstehe nicht genau warum, aber ich werde mit Stücken aus deiner Antwort herumspielen und sehen, ob ich es bekomme, ich muss auch das Stichwort 'using' nachschlagen, das erste Mal sehe ich es. Vielen Dank. – userian

+0

Froh, dass es @userian funktioniert hat. Werfen Sie einen Blick auf trincot Antwort auch. Es hat einen anderen Ansatz, aber es könnte auch für Sie funktionieren. –

1

Sie könnten eine Unterabfrage verwenden, um sowohl die Datensätze von 2016 zu erhalten und 2015, aber die Werte von 2016. Dann Gruppe negieren und wie Sie summieren schon tat:

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 

Dies wird auch für die Fälle arbeiten wo eine Zahl nur in einem der zwei Jahre gegeben wird.

+0

Hm, das funktioniert auch und nachdem ich nur den Teil mit der "UNION ALL" ausgeführt habe, sehe ich warum, ich wusste nur über UNION und als ich das zum ersten Mal im Terminal schrieb, bekam ich null als Unterschied, weil ich das ALL vermisste. Vielen Dank. – userian

+0

Ja, das 'ALL' wird benötigt, da ansonsten" Duplikate "eliminiert werden, aber das wäre in diesem Fall ein unerwünschter Effekt. Beachten Sie, dass wenn Sie für eine Person nur Daten im Jahr 2015 und nicht im Jahr 2016 haben, Sie trotzdem ein Ergebnis für diese Person erhalten. Das gleiche gilt, wenn Sie nur Daten im Jahr 2016 haben. – trincot