Spaltenname der max Zahl einer Zeile bestimmen

Dieter

Neuer Benutzer
Beiträge
4
Hall zusammen,

ich möchte als Ergebnis gerne den Spaltennamen zurückbekommen, welche den maximalen Wert einer Komponente in er Zeile hat!

KomponenteSpalte ASpalte BSpalte CSpalte D
123450276
345675023
567893215

Also hier:
12345, Spalte C
34567, Spalte A
56789, Spalte D

Freue mich über entsprechende Vorschläge!
Herzlichen Dank!

Dieter
 
Werbung:
Hach, das sind mal wieder echte Excelaufgaben hier!

Also eigentlich mag ich es ja nicht, wenn man auf eine Frage eine Gegenfrage gestellt bekommt, aber weil morgen Sonntag ist:
Wofür brauchst Du das?

Und warum ich diese Frage stelle:
Es ist ein mittleres Gewürge, soetwas abzufragen, potentiell Performance intensiv und irgendwie riecht es nach "worst practice"

Die Antwort: Eigentlich brauchst Du nur ein Case Statement, das die Aufgabe erledigt. Je nach DB Fähigkeiten kann man wahrscheinlich auch Arrays o.ä. nehmen.

Was ich eigentlich nur wissen will:
Waren Deine Spalten "Spalte A", "Spalte B", "Spalte C" ..
vor dieser Darstellung oben irgendwann mal Zeilen?

Wenn ja:
In dieser Ursprungsform stehen sie dann sehr wahrscheinlich so zur Verfügung, wie es für SQL gedacht und gewollt ist. Und vor allem in einer Form, in der sie auch nicht auf die Ausprägung von hier 4 Merkmalen beschränkt sind.

Es ist nur eine Vermutung. Wenn sie zutrifft, wäre der Ansatzpunkt für Deine Frage / Aufgabe etwas früher zu wählen, als der in Deiner Darstellung.
 
Diese Ergebnistabelle kommt aus Maschinendaten, wobei sich die Komponenten verändern können, die Spaltennamen sind immer dieselben!
(also die Antwort Deiner Frage: die Spalten kommen so raus ...)

Es sind auch immer nur 3 Zeilen, daher sollte die Perfomance also passen!

ich mache das mit SQL nun auch schon seit 20 Jahren und mag Excel nicht, aber irgendwie habe ich gerade hierbei ein Brett vor dem Kopf ... :(
 
Naja, eigentlich reicht für den Wert selbst soetwas wie die Greatest () Funktion. Weiß nicht, ob Dein MS SQL das hat / Kann.
Aber Du willst ja auch den Spaltenname wissen.

Wenn es wirklich statisch ist, dann ist es nur etwas Fleißarbeit es zu tippen:
CASE
WHEN Val1 >= Val2 AND Val1 >= Val3 THEN Val1
WHEN Val2 >= Val1 AND Val2 >= Val3 THEN Val2
WHEN Val3 >= Val1 AND Val3 >= Val2 THEN Val3
END AS Highest
hier fehlt natürlich eine Spalte, aber ich will ja nicht alles alleine machen

Das Gleiche nochmal für eine Spalte, die den zugehörigen Spaltennamen generiert.
 
Hallo Dieter,

wenn man viele Spalten hat, die man auf einen maximalen Wert prüfen oder auswerten muss, kann auch die UNPIVOT-Funktion helfen.
Das ist aber nur bis zu einer bestimmten Anzahl an Zeilen und Spalten noch wirklich performant - muss man also abwägen.
Mit UNPIVOT wandelt man Spalten zu Zeilen um und kann dabei auch Kopfspalten berücksichtigen.

Ich habe mal ein kleines Beispiel geschrieben, mit dem das vielleicht deutlicher wird:

Code:
IF OBJECT_ID('TempDB..#a') IS NOT NULL DROP TABLE #a

CREATE TABLE #a
(
    Gruppe varchar(255),
    Wert1 int,
    Wert2 int,
    Wert3 int,
    Wert4 int
);

INSERT INTO #a(Gruppe, Wert1, Wert2, Wert3, Wert4)
VALUES
('GruppeA', 1, 3, 5, 7),
('GruppeB', 3, 5, 1, 5),
('GruppeC', 8, 2, 4, 1)
;

SELECT
Gruppe,
MAX(Wert) as MaxWert,
MAX(CASE WHEN Wert = MaxWert THEN GRP ELSE NULL END) as Spalte,
STRING_AGG(CASE WHEN a.Wert = a.MaxWert THEN a.GRP ELSE NULL END, ',') as SpaltenNamen
FROM
(
    SELECT Gruppe, GRP, Wert,
    MAX(Wert) OVER (PARTITION BY Gruppe ORDER BY Gruppe) as MaxWert
    FROM  
       (
            SELECT Gruppe, Wert1, Wert2, Wert3, Wert4
            FROM #a
        ) p 
    UNPIVOT 
       (Wert FOR GRP  IN  
          ( Wert1, Wert2, Wert3, Wert4 ) 
    )AS unpv
) a
GROUP BY Gruppe

In dem inneren SELECT wird die UNPIVOT-Funktion verwendet, die aus den Spalten entsprechende Zeilen generiert.

Mit der Fensterfunktion MAX(...) OVER (PARTITION BY ... ORDER BY ...) wird der maximale Wert einer Gruppe ermittelt, was bei vielen Spalten und durch die UNPIVOT-Funktion erzeugten Zeilen nicht zur Performance-Verbesserung beiträgt, aber dabei hilft die Spalte zu ermitteln, in der sich der maximale Wert befindet.

Mit dem äußeren SELECT werden dann die Werte einer Gruppe wieder aggregiert, wobei für den Wert dann die einfache MAX-Funktion verwendet werden kann. Über die Spalte "MaxWert" wird ein Spaltenname ermittelt, in dem sich ein größter Wert befindet.
Ab SQL Server 2017 kann man auch die STRING_AGG-Funktion verwenden. Damit kann man alle Spaltennamen mit dem größten Wert zusammenfassen. (Bei niedrigeren Versionen funktioniert diese Funktion nicht - auskommentieren oder Zeile löschen)

Viele Grüße,
Tommi
 
Werbung:
Auch Dir einen herzlichen Dank!

Ich hab das gestern mal aufgrund des Ansatztes von Dabadepdu das ganze gebaut und es lieferte das, was ich brauchte!

Dein Ansatz ist natürlich sehr interessant und es kann sein, dass ich den noch gut gebrauchen kann!

Beste Grüße
Dieter
 
Zurück
Oben