Min und Max einer Summe finden

Kohlrabisack

Benutzer
Beiträge
10
Hallo,

ich versuche aus einer Datenbank das Jahr und den Monat mit der kleinsten und das Jahr und den Monat mit der größten Gesamtsumme je auszugeben.
Kann das über eine Abfrage realisiert werden oder muss ich da mit PHP ran?

LG
Maik
 
Werbung:
geht ziemlich sicher mit SQL, aber mir ist nicht ganz klar, was Du erreichen willst, wie Deine Tabelle aufgebaut ist etc. Eine Beispieltabelle mit Daten und dem gesuchten Resultat wäre schon hilfreich ... idealerweise nachvollziehbar via Copy&Paste.
 
nun, wir versuchen mal zu raten ...

Code:
postgres=# select * from kohlrabisack;
 id |   datum    | wert 
----+------------+------
  1 | 2022-01-01 |   20
  2 | 2022-01-10 |   25
  3 | 2022-02-10 |  250
  4 | 2022-03-10 |  150
  5 | 2022-04-20 | 1150
  6 | 2022-04-21 | 2150
(6 rows)

postgres=# with foo as (select date_trunc('month', datum) as monat, sum(wert) as monatswert from kohlrabisack group by date_trunc('month', datum)) (select 'minimum' as gesucht, to_char(monat,'yyyy-mm') as monat, monatswert from foo order by monatswert limit 1) union all (select 'maximum', to_char(monat,'yyyy-mm'), monatswert from foo order by monatswert desc limit 1); 
 gesucht |  monat  | monatswert 
---------+---------+------------
 minimum | 2022-01 |         45
 maximum | 2022-04 |       3300
(2 rows)


postgres=#

Ist es das, was Du suchst?
 
Ist es das, was Du suchst?
Ja, kann man das auch auf MySQL umstricken? Welche Funktionen sollte ich mir anschauen?

Bisher bekomme ich mit folgender Abfrage das Jahr und die zugehörigen Monatssummen, aber ich benötige ja nur das Jahr mit dem Monatshöchst- und Tiefstwert.

Code:
SELECT
  YEAR(RDATUM) as Jahr,
  SUM(if(MONTH(RDATUM) = 1,NSUMME,0)) as "Jan",
  SUM(if(MONTH(RDATUM) = 2,NSUMME,0)) as "Feb",
  SUM(if(MONTH(RDATUM) = 3,NSUMME,0)) as "Mrz",
  SUM(if(MONTH(RDATUM) = 4,NSUMME,0)) as "Apr",
  SUM(if(MONTH(RDATUM) = 5,NSUMME,0)) as "Mai",
  SUM(if(MONTH(RDATUM) = 6,NSUMME,0)) as "Jun",
  SUM(if(MONTH(RDATUM) = 7,NSUMME,0)) as "Jul",
  SUM(if(MONTH(RDATUM) = 8,NSUMME,0)) as "Aug",
  SUM(if(MONTH(RDATUM) = 9,NSUMME,0)) as "Sep",
  SUM(if(MONTH(RDATUM) =10,NSUMME,0)) as "Okt",
  SUM(if(MONTH(RDATUM) =11,NSUMME,0)) as "Nov",
  SUM(if(MONTH(RDATUM) =12,NSUMME,0)) as "Dez"
from
  JOURNAL
where QUELLE IN (3,4)
  and STADIUM <> 127
  AND YEAR(RDATUM) NOT IN(2022)
group by
    YEAR(RDATUM)
ORDER BY
    YEAR(RDATUM) DESC
 
Also quasi
Code:
SELECT
YEAR(RDATUM) as Jahr,
min(NSUMME) AS Minimum,
max(NSUMME) AS Maximum
FROM 
JOURNAL
where QUELLE IN (3,4)
  and STADIUM <> 127
  AND YEAR(RDATUM) NOT IN(2022)
group by
    YEAR(RDATUM)
ORDER BY
    YEAR(RDATUM) DESC
 
@ukulele
Leider nein, so ähnlich hatte ich das auch schon versucht.
Ich bekomme als Minimum Negativwerte und weis auch nicht welcher Monat das ist.

Code:
SELECT
DATE_FORMAT(RDATUM, '%Y-%c') as zeit,
min(NSUMME) AS Minimum,
max(NSUMME) AS Maximum
FROM
JOURNAL
where QUELLE IN (3,4)
  and STADIUM <> 127
  AND YEAR(RDATUM) NOT IN(2022)
group by
    YEAR(RDATUM)
ORDER BY
    YEAR(RDATUM) DESC

Ich muss mal schauen ob ich das mit nem Subselect lösen kann.
 
Nunja, negative Werte sind per Definition kleiner als positive, und auch kleiner als Null, das ist so gesehen richtig.
Code:
SELECT
YEAR(RDATUM) as Jahr,
MONTH(RDATUM) as Monat,
min((CASE WHEN NSUMME >= 0 THEN NSUMME ELSE 0 END)) AS Minimum,
max(NSUMME) AS Maximum
FROM
JOURNAL
where QUELLE IN (3,4)
  and STADIUM <> 127
  AND YEAR(RDATUM) NOT IN(2022)
group by
    YEAR(RDATUM),
MONTH(RDATUM)
ORDER BY
    YEAR(RDATUM) DESC
Wenn die Monatswerte dann zu Spalten werden sollen empfiehlt sich Pivot anzuschauen. Ansonsten ist es sehr viel Code.
 
Ok hab es jetzt so gelöst wie ich es Anfangs dachte vermeiden zu können. 😒
Ich hole mir die Jahre, Monate und Summen aus der DB und den Rest mache ich dann mit PHP.
PostgreSQL sieht ganz cool aus so mit der einen Zeile Code. :)
 
Ok hab es jetzt so gelöst wie ich es Anfangs dachte vermeiden zu können. 😒
Ich hole mir die Jahre, Monate und Summen aus der DB und den Rest mache ich dann mit PHP.
PostgreSQL sieht ganz cool aus so mit der einen Zeile Code. :)
Du hast den horizontalen Scrollbalken aber schon gesehen?
Auch bei postgresql braucht man etwas code...
 
😅 ja den hab ich schon gesehen, mir ging es nur darum das es eben machbar ist und bei MySQL wohl eher nicht.
Vielleicht aber doch und ich kenne mich zu wenig aus.
 
Werbung:
😅 ja den hab ich schon gesehen, mir ging es nur darum das es eben machbar ist und bei MySQL wohl eher nicht.
Vielleicht aber doch und ich kenne mich zu wenig aus.
Leider scheint das letzteres zu sein :-(
Schreib mal auf was du möchtest z.B. 2 Rows, eine für min eine für MAx. Oder willst du alles in einer Zeile.
Und was soll passieren wenn mehrere Monate den gleichen Min oder Max Wert haben

Gruß

Bernd
 
Zurück
Oben