Werte aus unterschiedlichen Spalten untereinander sortieren

alexfrenzel92

SQL-Guru
Beiträge
122
Guten Abend miteinander,

Ich habe mehrere Werte aus unterschiedlichen Spalten, gegebenenfalls aus mehreren Tabellen durch Joins.
Kann ich den höchsten, zweithöchsten, etc. Wert aller dieser Spalten ausgeben? Sodass er mehrere Spalten in eine zusammenfügt und diese neue Spalte untereinander sortiert?

mfg Danke
Grüße
Alex
 
Werbung:
In PostgreSQL:

Code:
test=*# select * from bla;
 c1  | c2  | c3  | c4
-----+-----+-----+-----
  1 |  2 |  3 |  4
 150 | 140 | 130 | 120
  5 |  1 |  8 |  5
(3 rows)

Time: 0,162 ms
test=*# select greatest(c1,c2,c3,c4), least(c1,c2,c3,c4) from bla order by greatest(c1,c2,c3,c4);
 greatest | least
----------+-------
  4 |  1
  8 |  1
  150 |  120
(3 rows)

Falls MySQL das mal wieder nicht kann: via einzelner UNION [ALL] - Abfragen die Werte in eine Spalte bringen und sortieren.
 
Oder auch nur fast - kann ich die sortierte neue Tabelle, die durch mehrere Selects, AS und UNION ALLs erstellt wurde auf eine bestimmte Zelle beschränken?

Der Hintergrund ist der, dass ich den Wert dieser Zelle per INSERT in eine andere Tabelle einfügen will. Und INSERT braucht höchstens einen Wert, wenn er in eine bestimmte Zelle eingefügt werden soll.

Das Problem ist, dass ich durch LIMIT und ORDER BY zwar die Zeile beschränken und bestimmen kann, jedoch mindestens zwei Spalten übrig bleiben (Die Spalte, deren Wert, den ich habe will und die Spalte, nach der sortiert wird und nach dem Wort benannt wird, die hinter dem AS steht)

Danke nochmals im Vorraus
 
Dann selektiere nur eine Spalte.

Die Spalte, nach der ich sortieren will muss ich selektieren, da sie dadurch erst zustande kommt.

Code:
Die Tabelle Spieler enthält die Spalten SpielerID, Stärke, Position und Nebenposition - Die Tabelle Übersicht enthält die Spalten SpielerID und Priorität.


SELECT SpielerID, Stärke * 1 AS Gesamtstärke, Priorität FROM Übersicht INNER JOIN Spieler ON Übersicht.SpielerID = Spieler.ID WHERE Position = 1
UNION ALL
SELECT SpielerID, Stärke * 0,5 AS Gesamtstärke, Priorität FROM Übersicht INNER JOIN Spieler ON Übersicht.SpielerID = Spieler.ID WHERE Nebenposition = 1
ORDER BY Stärke desc, Priorität asc

Dadurch, dass ich nach mehreren Spalten sortieren will und überhaupt erst nach einer Spalte, die erzeugt wird und erst dann sortiert werden kann, weil sie dadurch die richtig errechneten Werte enthält. Ob ich Priorität selektieren muss weiß ich nicht aber Stärke * x AS Gesamtstärke muss ich selektieren
 
Das ist unlogisch. Zum einen sagst Du: "den Wert dieser Zelle per INSERT in eine andere Tabelle einfügen will. Und INSERT braucht höchstens einen Wert, wenn er in eine bestimmte Zelle eingefügt werden soll." - es geht also um exakt einen konkreten Wert. Und dann sagst Du: "nach mehreren Spalten sortieren will und überhaupt erst nach einer Spalte, die erzeugt wird und erst dann sortiert werden kann, weil sie dadurch die richtig errechneten Werte enthält." - hier also mehrere Werte.

Ausgehend von meinen Beispieldaten: welchen Wert suchst Du?
 
Das wär unlogisch, ja.
Und dann sagst Du: "nach mehreren Spalten sortieren will und überhaupt erst nach einer Spalte, die erzeugt wird und erst dann sortiert werden kann, weil sie dadurch die richtig errechneten Werte enthält." - hier also mehrere Werte.
In dieser Spalte gibt es natürlich mehrere Werte, aber nur einen Wert, der in der gleichen Zeile steht, wie der höchste Wert in einer anderen Spalte. Dazu kommt, dass die Spalte, nach der ich sortieren will die gleiche Spalte in verschiedenen Variationen (multipliziert mit jeweils 0,5, 1 , 0,75... je nach Zutreffen der WHERE-Klausel) enthält.

Die Werte der Spalten, nach denen ich sortieren will, will ich gar nicht haben, sondern den Wert in der gleichen Zeile, die gemäß der Sortierung die oberste ist. Bei den errechneten Werten rede ich trotzdem nur von mehreren Werten in einer Spalte.

Ausgehend von meinen Beispieldaten: welchen Wert suchst Du?
Je nach dem, was in c3 steht, soll die Spalte c2 mit 0,5 oder 0,75 oder 1 multipliziert werden. Diese neue Spalte soll sortiert werden und ich suche den Wert aus c1 neben dem höchsten Wert dieser fiktiven Spalte
 
Zuletzt bearbeitet:
Du hast meine Bitte, ausgehend von meinen Beispieldaten zu zeigen, was Du suchst, nicht beantwortet. Ich rate einfach mal:

Code:
test=*# select case when c2 > 100 then c1 * 0.7 else c1 * 1.7 end from bla order by c4 desc limit 1;
 case
-------
 105.0
(1 row)

Wie gesagt: ich kann nicht nachvollziehen, was Du genau suchst, denke aber: sobald man es beschreiben kann, findest sich auch das passende Select.
 
Dann ist ja prima, weil ich das faktisch beantwortet habe.

Code:
test=*# select case when c2 > 100 then c1 * 0.7 else c1 * 1.7 end from bla order by c4 desc limit 1;
case
-------
105.0
(1 row)

Dadurch, dass mein Beispiel JOINS und AS enthält, brauche ich gerade ein bischen, um deine Antwort umzusetzen. Ich denke, ganz wars das noch nicht, da manche Zeilen mehrmals enthalten sind. (Einmal dort, wo der Wert in der Spalte c1 (in meinem EDIT war es c2) mit 0,7 multipliziert wird und einmal, wenn sie mit 1,7 oder sonstwas multipliziert wird). Das ist notwendig, weil ich nicht nur die höchste Zeile, sondern beispielsweise auch die elf-höchste Zeile brauche
 
Am einfachsten wäre ein übergeordnetes SELECT, falls das möglich wäre.

Jeder SELECT-Befehl erstellt ja eine Tabelle mit x Spalten. Wenn man da ein weiteres SELECT machen könnte:
Code:
SELECT Spalte1 FROM (SELECT...FROM...WHERE...) LIMIT 1
wäre das alles überhaupt kein Problem. Geht sowas?
 
Werbung:
Zurück
Oben