Mysql Berechnung
Hallo MySQL Profis,
es wäre toll wenn mir jemand behilflich bei einer Abfrage sein könnte.
In der Abfrage soll folgendes noch berechnet werden:
((summe1-summe2)-summe3) *100 / summe1 as prozent
SELECT
SUM(IF(status != 3 AND status != 4 AND transanr != 'Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , gesamt, 0)) as summe1,
SUM(IF(status != 3 AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , untern_verguetung, 0)) as summe2,
SUM(IF(status!=3 AND transanr='Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31',gesamt,0)) as summe3
FROM posten
Könnte mir da bitte jemand auf die Sprünge helfen.
Vielen Dank jetzt schon mal.
datadexx
es wäre toll wenn mir jemand behilflich bei einer Abfrage sein könnte.
In der Abfrage soll folgendes noch berechnet werden:
((summe1-summe2)-summe3) *100 / summe1 as prozent
SELECT
SUM(IF(status != 3 AND status != 4 AND transanr != 'Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , gesamt, 0)) as summe1,
SUM(IF(status != 3 AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , untern_verguetung, 0)) as summe2,
SUM(IF(status!=3 AND transanr='Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31',gesamt,0)) as summe3
FROM posten
Könnte mir da bitte jemand auf die Sprünge helfen.
Vielen Dank jetzt schon mal.
datadexx
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212484
Url: https://administrator.de/contentid/212484
Ausgedruckt am: 15.11.2024 um 23:11 Uhr
5 Kommentare
Neuester Kommentar
FROM posten
... die SUM Funktion ist natürlich abhängig von der Gruppierung und Filterung und kann so leider nicht verwendet werden.ABER: Du kannst mit 3 Abfragen über die selbe Tabelle arbeiten und davon die Ergebnisse verwenden.
Ich empfehle zuerst über Datum zu filtern, danach die 3 summen davon zu bilden, und dann die Berechnung auszuführen. Dann könnte man noch überlegen das Ergebnis irgendwo zu cachen, da diese Berechnung rel. aufwendig ist.
reicht da nicht einfach ein:
.. in etwa
SELECT *, ((summe1-summe2)-summe3) *100 / summe1 as prozent FROM (
SELECT
SUM(IF(status != 3 AND status != 4 AND transanr != 'Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , gesamt, 0)) as summe1,
SUM(IF(status != 3 AND DATUM BETWEEN '2013-01-01' AND '2013-12-31' , untern_verguetung, 0)) as summe2,
SUM(IF(status!=3 AND transanr='Gutschrift' AND DATUM BETWEEN '2013-01-01' AND '2013-12-31',gesamt,0)) as summe3
FROM posten
)
Moin nxclass,
in Prinzip bin ich auf deiner Seite, aber...*lach*
-> da insgesamt die Tabelle "posten" nicht auf das Jahr 2013 eingeschränkt wird, berechnest du den ganzen Mist bis rückwärts zum Jahr 1972, wenn die genug Daten haben. Machst also immer einen Fullselect auf die Detaildaten.
-> aber keine Angst, der hört vorher auf, weil in den 1972er Datensätzen auch die Pseudo-Spatle "summe1" den Wert 0 hat.
Und da grätscht die Engine mit DIV/0 ab bei der Prozentberechnung.
Grüße
Biber
in Prinzip bin ich auf deiner Seite, aber...*lach*
-> da insgesamt die Tabelle "posten" nicht auf das Jahr 2013 eingeschränkt wird, berechnest du den ganzen Mist bis rückwärts zum Jahr 1972, wenn die genug Daten haben. Machst also immer einen Fullselect auf die Detaildaten.
-> aber keine Angst, der hört vorher auf, weil in den 1972er Datensätzen auch die Pseudo-Spatle "summe1" den Wert 0 hat.
Und da grätscht die Engine mit DIV/0 ab bei der Prozentberechnung.
Grüße
Biber
Moin datadexx,
Wenn bei dir ein Feld "SummeX" angemeckert wird, dann kann es nicht nxclass' Statement gewesen sein, was du abgeschickt hast.
Aber nochmal zum Prinzip: Es wurde bereits angesprochen, das du möglichst nicht 3x einen Select auf die "Posten"-Tabelle machen solltest, um drei Summen zu bilden.
Richtiger Weg ist die Pivotierung mit irgendwelchen IIF() oder CASE WHEN-Konstrukten (was so die jeweilige Datenbank anbietet).
Ein nur einmaliger Zugriff auf "Posten" wäre dann sinnvoll, wenn da wirklich entscheidend mehr Datensätze drin sind als die des Jahres 2013 (also z.B. wirklich die letzten paar Jahre) und wenn dort auch nur unaggregierte Detaildaten (tagesgenaue Buchungssätze) vorhanden sind.
Wenn es in diese Richtung geht, dann würde ich die 4 relevanten Felder für die Abfrage mit einem Subselect rausholen
... und wenn dieses Select klappt, dann kann aussen drum noch ein weiteres äüßeres "Select From" mit Summe1, summe2 etc wie oben von nxclass gepostet.
Aber erstmal muss doch dieses hier verifiziert werden
Grüße
Biber
Zitat von @datadexx:
So hab ich das bereits gehabt, aber dann bekomme ich nen error. Unknown column summeX
Na ja, ähneln werden sich unsere Statements schon alle mehr oder weniger, aber aus deinem Eröffnungspost geht ja nun auch nicht hervor, wie dein konkretes Statement und wie die exakte Fehlermeldung aussieht.So hab ich das bereits gehabt, aber dann bekomme ich nen error. Unknown column summeX
Wenn bei dir ein Feld "SummeX" angemeckert wird, dann kann es nicht nxclass' Statement gewesen sein, was du abgeschickt hast.
Aber nochmal zum Prinzip: Es wurde bereits angesprochen, das du möglichst nicht 3x einen Select auf die "Posten"-Tabelle machen solltest, um drei Summen zu bilden.
Richtiger Weg ist die Pivotierung mit irgendwelchen IIF() oder CASE WHEN-Konstrukten (was so die jeweilige Datenbank anbietet).
Ein nur einmaliger Zugriff auf "Posten" wäre dann sinnvoll, wenn da wirklich entscheidend mehr Datensätze drin sind als die des Jahres 2013 (also z.B. wirklich die letzten paar Jahre) und wenn dort auch nur unaggregierte Detaildaten (tagesgenaue Buchungssätze) vorhanden sind.
Wenn es in diese Richtung geht, dann würde ich die 4 relevanten Felder für die Abfrage mit einem Subselect rausholen
...
SELECT SUM(IIF(status != 4 AND transanr != 'Gutschrift' , gesamt, 0) ) as summe1
, SUM(untern_verguetung) as summe2
, SUM(IIF(transanr='Gutschrift', gesamt, 0) ) as summe3
FROM (
SELECT status, transanr, gesamt, untern_verguetung
FROM posten
WHERE DATUM BETWEEN '2013-01-01' AND '2013-12-31'
AND status != 3 -- trifft für alle Summen zu
)
... und wenn dieses Select klappt, dann kann aussen drum noch ein weiteres äüßeres "Select From" mit Summe1, summe2 etc wie oben von nxclass gepostet.
Aber erstmal muss doch dieses hier verifiziert werden
Grüße
Biber