# mysql Zählerstand berechnen



## weissichkeinen (8. Oktober 2009)

Hallo
Ich möchte den Stromverbrauch in mysql berechnen lassen. Dazu habe ich eine Tabelle 

```
nummer  zählerstand
1        26624.0  
2        31284.0  
3        37165.0  
4        40625.0  
5        40644.2  
6        40711.5
```

Nun brauche ich eine Spalte in dem der Verbrauch steht. Das ganze sollte so aussehen:

```
nummer  zählerstand verbrauch
1        26624.0      26624.0
2        31284.0       4660,0
3        37165.0       5881,0
4        40625.0       3460,0     
5        40644.2         19,2  
6        40711.5         67,3
```

Probiert habe ich es mit diesem Code aber es kommt das falsche Ergebnis.



```
SELECT t1.nummer, t1.zählerstand, SUM( t2.zählerstand - t1.zählerstand ) AS 'verbrauch'
FROM Stromverbrauch AS t1, Stromverbrauch AS t2
WHERE t1.nummer >= t2.nummer
GROUP BY t1.nummer
```

Hat mir jemand einen Tip wo der Fehler liegt?
_Muß gestehen das ich nicht viel Ahnung von mysql habe und bin für jede Hilfe dankbar._


----------



## dki (8. Oktober 2009)

Mir ist leider kein Konstrukt bekannt, dass man auf das nächste Tupel in der DB zugreifen kann.

Dein Ansatz mit dem Join ist zwar gut, aber auch nicht passend, denn du bekommst bei deinem momentan Join, 6!(6*5*4*3*2*1) einträge.

Wenn du aber sowas machen würdest:

```
WHERE t1.nummer+1 = t2.nummer
```
hättest du das Problem mit dem letzten Eintrag.

Um es kurz zu machen.
Es wäre besser du würdest noch eine Spalte Einfügen: alter Zählerstand.
Also: nummer, alter_Zählerstand, neuer_Zählerstand

Dann könntest du so eine schöne einfache Abfrage machen:


```
SELECT nummer, neuer_Zählerstand, (neuer_Zählerstand - alter_Zählerstand)  AS verbrauch
FROM Stromverbrauch
```


----------



## Biber2 (8. Oktober 2009)

Moin weissichkeinen,

kann dki nur zustimmen.

Ein Notbehelf unter der Voraussetzung, dass das Feld "Nummer" nie mit 0 (numerisch Null) ist wäre z.B.

```
SELECT S1.nummer, S1.Zählerstand, 
s2.nextstand, s2.nextstand-s1.Zählerstand as Verbrauch
FROM 
( Select nummer, Zählerstand from Stromverbrauch 
 union all
select distinct 0, 0 from stromverbrauch ) s1, 
(select nummer-1 as nextnr, zählerstand as nextstand 
from stromverbrauch) s2 
where s1.nummer =s2.nextnr
```

Grüße
Biber


----------



## Matthias Reitinger (8. Oktober 2009)

weissichkeinen hat gesagt.:


> Probiert habe ich es mit diesem Code aber es kommt das falsche Ergebnis.
> 
> 
> 
> ...


Der Ansatz ist schon nicht schlecht, mit ein paar Verbesserungen funktioniert er auch:
	
	
	



```
SELECT 
t1.nummer, t1.zählerstand, MIN(t1.zählerstand- IFNULL(t2.zählerstand, 0)) AS verbrauch
FROM Stromverbrauch AS t1
LEFT JOIN Stromverbrauch AS t2 ON (t1.nummer > t2.nummer)
GROUP BY t1.nummer
```
Wenn du sicherstellen kannst, dass es keine Lücken zwischen den Einträgen gibt, ginge auch das hier (evtl. effizienter)

```
SELECT 
t1.nummer, t1.zählerstand, MIN(t1.zählerstand- IFNULL(t2.zählerstand, 0)) AS verbrauch
FROM Stromverbrauch AS t1
LEFT JOIN Stromverbrauch AS t2 ON (t1.nummer = t2.nummer + 1)
GROUP BY t1.nummer
```



dki hat gesagt.:


> Um es kurz zu machen.
> Es wäre besser du würdest noch eine Spalte Einfügen: alter Zählerstand.
> Also: nummer, alter_Zählerstand, neuer_Zählerstand


Das wäre aber nicht im Sinne der Normalisierung. Besser wäre es, wenn dann die nummer des vorherigen Eintrages zu speichern.

Grüße, Mattthias


----------



## weissichkeinen (9. Oktober 2009)

Ja, genau das was ich suchte! Danke Matthias.


----------



## dani_n (2. Februar 2019)

Hallo! Ich habe im gründe die gleiche Thematik, auch wenn der Post doch schon etwas älter ist. 
Ich habe eine Tabelle in der laufend der Zählerstand, Unix Timestamp und eine ID eingetragen wird. 
Nun möchte ich allerdings nur bestimmte Einträge von einander abziehen. Mein Ziel ist es zum Beginn und zum Ende des Tages den Verbrauch zu ermitteln. 

Ich weiß leider nicht so recht, wie ich das in die Abfrage mit einbauen kann. Hat jemand dazu einen Tipp?


----------



## Yaslaw (4. Februar 2019)

Ist schwer zu sagen was du tun sollst, wenn wir keinerlei Angaben haben. Nur anhand der Idee muss ich sagen, die Lösung steht in diesem Thread. Wenn nicht, dann musst du mehr liefern. Ein Beispiel deiner Tabelle. EIn Beispiel wie das Resultat dann aussehen soll,


----------

