helmuthelmut2000
Goto Top

ORDER BY über mehrere Spalten

Hallo,

Ich habe eine PHP-Seite die Daten aus einer MSSQL-DB auslesen soll.

Dort habe ich mehrere Spalten:

Name, Vorname, Datum1, Datum2, Datum3.
Mayer, Hans, 12.12.2011, NULL, NULL.
Müller, Peter, NULL, 06.12.2011,NULL.
Wagner, Peter, NULL, NULL, 07.12.2011.

Jetzt sollte die Sortierung so kommen:

Name, Vorname, Datum1, Datum2, Datum3.
Müller, Peter, NULL, 06.12.2011,NULL.
Wagner, Peter, NULL, NULL, 07.12.2011.
Mayer, Hans, 12.12.2011, NULL, NULL.

Es sollte nach Datum über mehrere Spalten Sortiert werden.
Geht das noch mit ORDER BY?

Content-ID: 177543

Url: https://administrator.de/contentid/177543

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

Berrnd
Berrnd 11.12.2011 um 15:46:57 Uhr
Goto Top
Hi,

ja, Beispiel: ;)
select *
from dbo.test1
order by coalesce(Datum1, Datum2, Datum3)
Die Funktion COALESCE nimmt den ersten Wert, der nicht NULL ist.
Siehe http://msdn.microsoft.com/en-en/library/ms190349.aspx

Gruß - Bernd
Biber
Biber 11.12.2011 um 15:50:52 Uhr
Goto Top
Moin helmuthelmut2000,

Rückfrage:
kann denn immer nur eine der Datumsspalten NOT NULL sein oder können dort auch z.B alle drei Spalten einen Datumswert beinhalten?

Grüße
Biber
helmuthelmut2000
helmuthelmut2000 11.12.2011 um 19:42:34 Uhr
Goto Top
Hallo Biber,

Ja es können auch z.B. alle drei Spalten einen Datumswert haben.

Grüße Helmut
helmuthelmut2000
helmuthelmut2000 12.12.2011 um 13:55:07 Uhr
Goto Top
Hallo,

Ich kann das auch so machen das immer nur in einer Spalte ein Datumswert ist.

Gibts dann eine Lösung?
Biber
Biber 12.12.2011 um 15:09:53 Uhr
Goto Top
Moin helmuthelmut2000,

es gibt für alles eine Lösung face-wink

  • Wenn nur eine der drei Spalten ungleich NULL ist, dann passt Bernd-'s Lösung.
Fertig, Haken dran, gut is'.

  • wenn keine, eine, zwei oder drei mit Datumswerten gefüllt sein können
- UND-
  • vom ältesten zum "höchsten" Datum sortiert ausgeben werden soll
- UND-
  • die NULL-Werte aber "als Letztes" in der Sortierreihenfolge erscheinen sollen, dann wird es ein bisschen unappetitlich.

Ich versuch mal eine Skizze
-- hier mal ein Access-SQL, falls kein MSSQL griffbereit
select  name, vorname, datum1, datum2, datum3 from  (
SELECT name, vorname, datum1, datum2, datum3
                        ,  IIF( IsNull(datum1), date() + 1000 , datum1) as a
                        ,  IIF( IsNull(datum2), date() + 1000 , datum2) as b
                        ,  IIF( IsNull(datum3), date() + 1000 , datum3) as c
FROM Helmuthelmut2000
)
order by IIf( a <= b and a<= c, a, IIF( b<=a and b<=c, b,c))
;
Hier dasselbe als MSSQL
select  name, vorname, datum1, datum2, datum3 from (
SELECT name, vorname, datum1, datum2, datum3
                        ,  coalesce(datum1, dateadd(dd,1000,getdate()) ) as a
                        ,  coalesce(datum2, dateadd(dd,1000,getdate())) as b
                        ,  coalesce(datum3, dateadd(dd,1000,getdate())) as c
FROM Helmuthelmut2000
)
order by CASE
        WHEN (a <= b and a<= c) THEN a
        WHEN ( b<=a and b<=c)  THEN b
        ELSE c
        END
;

Da ein Datumswert von NULL in deiner Sortirung ja als "der höchste" erscheinen soll, habe ich NULL übersetzt mit Heute plus 1000 Tage.
Wegen der Lesbarkeit habe ich Pseudospalten a, b, c eingefügt, wesentlich ist das ORDER BY IIF/CASE WHEN... in der letzten Zeile.

[Edit] Bei MSSQL-Variante auf Dateadd() und CASE WHEN...END geändert [/Edit]

Grüße
Biber
Biber
Biber 31.12.2011 um 16:31:24 Uhr
Goto Top
Moin helmuthelmut2000,

es gibt so viele ungeklärte Fragen auf dieser Welt...

Werden die Zuschauer Guttenberg als Wetten-dass-Moderator akzeptieren?
Kann Angie die Hosenanzug-Industrie aus der Krise führen?
Werden dank Alfons Schubeck die Klopsbratereien mehr Umsatz oder einen Anstieg der VegatarierInnen bewirken?

Können wir dann wenigstens dein relativ übersichtliches Problemchen abhaken?

Grüße
Biber