Kristina: Ausgabe des höchsten Wertes einer Zeile aus eine MYSQL Datenbank

Ich habe in einem Datensatz die Spalten Januar, Februar, März u.s.w

in jeder Zelle steht eine Zahl, ein Wert.

Wenn ich in jetzt die Tabelle auslese,

SELECT * FROM table

bekomme ich ja alle Daten der jeweiligen Zeile angezeigt.

Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

  1. Hallo Kristina,

    Ich habe in einem Datensatz die Spalten Januar, Februar, März u.s.w

    ob das sinnvoll ist? Bin nicht sicher.

    Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

    Grundsätzlich: SELECT MAX(spalte) FROM Tabellenname

    Aber um genauer, wären mehr Infos hilfreich.

    Abfrage über mehrere Spalten, evtl. Doppelwerte, Spaltentyp....

    Gruss
    Henry

  2. Tach!

    Ich habe in einem Datensatz die Spalten Januar, Februar, März u.s.w

    Sieht nach einem schlechten Design aus. Warum sind das mehrere Spalten und nicht nur eine "Monat".

    Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

    Nicht so einfach. Du kannst nicht nur einzelne Spalten nach bestimmten Kriterien in die Ausgabe aufnehmen, nur Datensätze können gefiltert werden. Dort wäre es recht einfach mit einem Group-by.

    Ich würde die Suche nach dem gewünschten Monat clientseitig vornehmen, wenn du das Datenschema nicht ändern kannst/möchtest.

    dedlfix.

    1. name total Januar Februar März April Mai Juni Juli August September Oktober November Dezember

      das sind meine Spalten

      1. Tach!

        name total Januar Februar März April Mai Juni Juli August September Oktober November Dezember

        das sind meine Spalten

        Das macht es nicht besser. Es gibt meines Wissens keine gescheite Lösung für das Problem. Wenn du es datenbankseitig lösen möchtest, wirst du um eine Stored Function nicht umhinkommen, in der du dann eine ähnliche Gymnastik wie auf dem Client vornehmen musst.

        dedlfix.

  3. Hi,

    Ich habe in einem Datensatz die Spalten Januar, Februar, März u.s.w

    in jeder Zelle steht eine Zahl, ein Wert.

    ob das so schlau ist?

    Wenn ich in jetzt die Tabelle auslese,

    SELECT * FROM table

    bekomme ich ja alle Daten der jeweiligen Zeile angezeigt.

    Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

    greatest(spalte1, spalte2, spalte3, ...) könnte helfen.

    cu,
    Andreas a/k/a MudGuard

    1. Tach!

      Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

      greatest(spalte1, spalte2, spalte3, ...) könnte helfen.

      Das gibt zwar den größten Wert, aber noch nicht den Monatsnamen dazu.

      dedlfix.

      1. Hello,

        Wie schaffe ich es, das mir nur der Monat ausgeben wird, mit dem höchsten Wert?

        greatest(spalte1, spalte2, spalte3, ...) könnte helfen.

        Das gibt zwar den größten Wert, aber noch nicht den Monatsnamen dazu.

        Da könnte es ja auch passieren, dass mehrere Zellen "den größten Wert" enthalten.
        Man müsste dann also auf jeden Fall auf eine Ergebnismenge geßasst sein und nicht nur auf ein einzelnes Name-Value-Paar. Das wird für so einfache Datenbanken, wie MySQL & Co. schon schwierig.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  4. Hello,

    Model nicht zuende entwickelt / normalisiert wurde Dir ja schon gesagt.

    Willst Du nur den höchsten Wert oder willst Du auch wissen, in welcher Spalte der einen Zeile der steckt?

    es steht Dir frei, den "größten Wert" einer kommaseparierten Liste von Werte mit greatest(value1, value2, ..., valueN) abzufragen. Damit bekommst Du aber leider nicht den Spaltennamen.

    also select greatest(jan, feb, mrs, apr, may, ...) from mytable where id = $n;

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  5. Hallo Kristina,

    Da deine Tabelle nicht normalisiert ist, musst du entweder dein DB Design ändern oder Dir einen normalisierten View erzeugen.

    Create view tabview as
    Select Name, 'Jan' as monat, januar as wert from table
    Union all
    Select Name, 'Feb' as monat, februar as wert from table
    Union all
    ...
    Union all
    Select Name, 'Dez' as monat, dezember as wert from table
    

    Basierend darauf kannst du nun so abfragen;

    Select Name, a.Monat, a.wert
    From tabview a Join (select Name,Max(wert) as maxwert from tabview Group by Name) b on a.Name=b.Name and a.wert=b.maxwert
    

    Vermutlich ist das nicht schnell. Dafür rettet es dein „Datenmodell“.

    Ein redesign des Modells ist auf jeden fall der bessere Weg

    Rolf

    --
    Dosen sind silbern