Datums-Query richtig sortieren? Mehrere Reihen!

Phlipmode

Grünschnabel
Hi Jungs und Mädels,

ich bin mal wieder auf eure Hilfe angewiesen und hoffe, dass mir jemand weiterhelfen kann.

Und zwar habe ich eine Art Terminplan, dort können Mitarbeiter Daten eintragen. Die relevanten Daten für meine Frage sind Ist-Datum, Plan-Datum Forecast-Datum.

Wenn ich mal eine phpmyadmin-Query durchführe, sieht das so aus.
SELECT Plan, Ist, Forecast FROM terminplan WHERE PID=15 ORDER BY Plan DESC

Code:
Plan			 Ist		 Forecast
2004-11-12	 2004-11-12	 NULL 
2005-02-11	 2005-02-11	 NULL 
2005-04-29	 NULL			 2005-07-31
2005-04-29	 NULL			 2005-07-31 
2005-05-31	 NULL			 2005-07-31 
2005-05-31	 NULL			 2005-07-31
2005-05-31	 2005-06-30	 NULL 
2005-06-30	 2005-06-30	 NULL 
2005-06-30	 NULL			 2005-07-31 
2005-06-30	 NULL			 2005-07-31 
2005-07-15	 NULL			 NULL 
2005-07-29	 NULL			 NULL 
2005-08-31	 NULL			 NULL 
2006-12-31	 NULL			 NULL

So, nun geht es auch schon los. Und zwar soll die Tabelle nach dem Query so sortiert sein, dass die Forecast-Daten mit den Ist-Daten sortiert werden. Im klartext müsste man die beiden Reihen zusammenfügen und dann nach Plan und zusammengefügter Reieh sortieren. Ziel dabei ist es, die Ist und Forecast-Daten korrekt sortiert zu haben. Da diese Sachen nachher grafisch ausgewertet werden in Excel, ist eine richtige Sortierung der Ist und Forecast-Daten zu den Plan-Daten notwendig. Habt ihr eine Idee, wie man das bewerkstelligen kann?


Im Endeffekt sollte es dann nachher so aussehen (made by hand :))

Code:
Plan	 Ist		Forecast
12.11.2004	 12.11.2004	 NULL
11.02.2005	 11.02.2005	 NULL
31.05.2005	 30.06.2005	 NULL
30.06.2005	 30.06.2005	 NULL
29.04.2005	 NULL			 31.07.2005
29.04.2005	 NULL			 31.07.2005
31.05.2005	 NULL			 31.07.2005
31.05.2005	 NULL			 31.07.2005
30.06.2005	 NULL			 31.07.2005
30.06.2005	 NULL			 31.07.2005
15.07.2005	 NULL			 NULL
29.07.2005	 NULL			 NULL
31.08.2005	 NULL			 NULL
31.12.2006	 NULL			 NULL

Oder kann man da direkt ne Query machen?

Danke für eure Hilfe!

P.S.: Sieht zwar nicht so schön aus, aber ich hoffe ihr wisst was ich meine!
 
Zuletzt bearbeitet:
Hallo,
versuch es mal mit
Code:
SELECT Plan, Ist, Forecast 
  FROM terminplan 
  WHERE PID=15 
  ORDER BY Ist, Forecast
. Bei MSSQL gibt es noch eine Funktion, mit der man definieren kann, wie null-Werte behandelt werden sollen - weiß aber im Moment nicht wie sich die nennt.
 
Du könntest Dir mit if ein künstliches Feld zum Sortieren erzeugen, wenn ich Dein Problem richtig verstanden habe:
Code:
SELECT
  Plan, 
  Ist, 
  Forecast,
  IF (Ist IS NULL, Forecast, Ist) AS SortDatum
FROM terminplan 
WHERE PID=15 
ORDER BY SortDatum DESC
Gruß hpvw
 
Hallo,
jetzt, nachdem ich die Antwort von hpvw gelesen habe, verstehe ich die Frage ganz anders als vorher. Es sollen also die Spalten Ist und Forecast so sortiert werden, als ob die Werte in einer Spalte stehen würden.
Da das Ergebnis mit Excel weiterverarbeitet werden soll, ist anzunehmen, dass die Anzahl der DS nicht sehr groß und daher der Sortiervorgang nicht zu lang sein wird.
 
also erstmal danke für die hilfe

Code:
SELECT Plan, Ist, Forecast 
  FROM terminplan 
  WHERE PID=15 
  ORDER BY Ist, Forecast

hatte ich schon ausprobiert, dann kommt allerdings nicht das raus was ich brauche

Code:
 SELECT
  Plan, 
  Ist, 
  Forecast,
  IF (Ist IS NULL, Forecast, Ist) AS SortDatum
FROM terminplan 
WHERE PID=15 
ORDER BY SortDatum DESC

ist im prinzip auch nicht schlecht, allerdings müsste die Plan-Datum-Reihe auch noch sortiert werden.

bei deiner Abfrage kommt folgendes

+------------+------------+------------+------------+
| Plan | Ist | Forecast | SortDatum |
+------------+------------+------------+------------+
| 2005-04-29 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-04-29 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL] | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | 2005-06-30 | [NULL] | 2005-06-30 |
| 2005-05-31 | 2005-06-30 | [NULL] | 2005-06-30 |
| 2005-02-11 | 2005-02-11 | [NULL] | 2005-02-11 |
| 2004-11-12 | 2004-11-12 | [NULL] | 2004-11-12 |
| 2005-07-29 | [NULL] | [NULL] | [NULL] |
| 2006-12-31 | [NULL] | [NULL] | [NULL] |
| 2005-08-31 | [NULL] | [NULL] | [NULL] |
| 2005-07-15 | [NULL] | [NULL] | [NULL] |
+------------+------------+------------+------------+


ich bräuchte das Ergebnis allerdings so wie oben beschrieben.

Noch jemand ne Idee? Danke schonmal
 
Sortiere doch anstatt absteigend (DESC) aufsteigend (ASC).
Dann muss man halt noch mal schauen, was mit den null-Werten passiert. Aber ein bisschen selber denken kann auch nicht schaden.

Gruß hpvw
 
Hallo,
wie soll das Ergebnis aussehen? In deinem Beispiel hast du die Daten aufsteigend sortiert. In deiner SQL-Abfrage sortierst du die Daten absteigend (ORDER BY Plan DESC).
Ich habe bei deinem Beispiel ein paar Daten geändert. Sortiere bitte diese Daten so, wie du sie haben willst. Vielleicht können wir dir dann helfen.
Code:
Plan	 Ist		Forecast
12.11.2004	 12.11.2004	 NULL
11.02.2005	 11.02.2005	 NULL
31.05.2005	 30.06.2005	 NULL
30.06.2005	 30.06.2005	 NULL
29.04.2005	 NULL		 31.07.2005
29.04.2005	 NULL		 01.05.2005
31.05.2005	 NULL		 31.07.2005
31.05.2005	 NULL		 20.06.2005
30.06.2005	 NULL		 31.07.2005
30.06.2005	 NULL		 31.07.2005
15.07.2005	 NULL		 NULL
29.07.2005	 NULL		 NULL
31.08.2005	 NULL		 NULL
31.12.2006	 NULL		 NULL
 
Also, dass ich nicht selbe denke, lass ich mir mal nicht vorwerfen. Ich habe schon 5-6 Stunden nur an der Query-Eingabe gesessen und alles mögliche ausprobiert.

Ich bin auch immer dankbar für jeden kleinen Fetzen Hilfe.

Wenn ich deine Abfrage starte kommt ja das herraus

Code:
 +------------+------------+------------+------------+
| Plan	   | Ist		| Forecast   | SortDatum  |
+------------+------------+------------+------------+
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-04-29 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-05-31 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-02-11 | 2005-02-11 | [NULL]	 | 2005-02-11 |
| 2004-11-12 | 2004-11-12 | [NULL]	 | 2004-11-12 |
| 2005-07-29 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2006-12-31 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-08-31 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-07-15 | [NULL]	 | [NULL]	 | [NULL]	 |
+------------+------------+------------+------------+

wenn ich

Code:
 SELECT
  Plan, 
  Ist, 
  Forecast,
  IF (Ist IS NULL, Forecast, Ist) AS SortDatum
FROM terminplan 
WHERE PID=15 
ORDER BY SortDatum ASC
durchführe

Code:
+------------+------------+------------+------------+
| Plan	   | Ist		| Forecast   | SortDatum  |
+------------+------------+------------+------------+
| 2005-07-15 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-07-29 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2006-12-31 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-08-31 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2004-11-12 | 2004-11-12 | [NULL]	 | 2004-11-12 |
| 2005-02-11 | 2005-02-11 | [NULL]	 | 2005-02-11 |
| 2005-06-30 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-05-31 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-04-29 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-04-29 | [NULL]	 | 2005-07-31 | 2005-07-31 |
+------------+------------+------------+------------+
kommt das herraus.

was ich aber brauche ist

Code:
 +------------+------------+------------+------------+
| Plan	   | Ist		| Forecast   | SortDatum  |
+------------+------------+------------+------------+
| 2004-11-12 | 2004-11-12 | [NULL]	 | 2004-11-12 |
| 2005-02-11 | 2005-02-11 | [NULL]	 | 2005-02-11 |
| 2005-05-31 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-06-30 | 2005-06-30 | [NULL]	 | 2005-06-30 |
| 2005-04-29 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-04-29 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-05-31 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-06-30 | [NULL]	 | 2005-07-31 | 2005-07-31 |
| 2005-07-15 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-07-29 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2005-08-31 | [NULL]	 | [NULL]	 | [NULL]	 |
| 2006-12-31 | [NULL]	 | [NULL]	 | [NULL]	 |

+------------+------------+------------+------------+

Also im Klartext die Felder Ist und Forecast zusammenführen und sortieren (ASC) mit den dazugehörigen Plan-Daten und dann das Ergebnis dann noch untereinander nach Plan-Datum sortieren. So wie halt dargestellt.

Danke
 
Dann gehen wir da doch mal analytisch ran:
Folgende Fehler finde ich in der Sortierung:
  • Gleiche Werte werden nicht zusätzlich nach dem Plan-Datum sortiert
  • null-Werte stehen am Anfang und nicht am Ende.
Das erste Problem läßt sich ganz einfach lösen, indem man zusätzlich nach dem Plan-Datum sortiert. Wie so etwas machbar ist, läßt sich üblicherweise im Handbuch nachschlagen.

Das zweite Problem liegt offensichtlich daran, dass für MySQL null-Werte kleiner als belegte Werte sind. Man muss also eine zusätzliche Unterscheidung treffen, um dieses abzufangen. Unterscheidungen kann man, wie in jeder anderen Programmiersprache auch, durch eine If-Abfrage lösen.

Daraus ergibt sich dann folgende Abfrage:
Code:
 SELECT
  Plan, 
  Ist, 
  Forecast,
  IF (Ist IS NULL, Forecast, Ist) AS SortDatum,
  IF ((Ist IS NULL) AND (Forecast IS NULL),1,0) AS KeinDatum
FROM terminplan 
WHERE PID=15 
ORDER BY 
  KeinDatum ASC, 
  SortDatum ASC, 
  Plan ASC
Das sind nur zwei einfache Gedankengänge und ein Blick ins Handbuch.

Gruß hpvw
 
ja das sieht ganz gut aus, werde ich gleich morgen früh mal ausprobieren.

Das sind nur zwei einfache Gedankengänge und ein Blick ins Handbuch.

Und warum gibt es denn deiner Meinung nach solche Foren wie diese.
Es ist doch immer wieder schön, solchen lieben Leuten wie mir zu helfen oder nicht?
Dann ist doch ein schönes "Danke" tausend mal mehr Wert.
Ich denke einfach, das du in dieser Hinsicht wesentlich erfahrener bist, und für dich diese Ausarbeitung des Queries nicht umbedingt schwer war. Ich habe mir da schon einige Hacken bei abgebrochen, bin relativ neu bei MySQL.

Also, weiter so und danke nochmal für die Hilfe und nicht immer so böse sein zu den Leuten die hier auch, in euren Augen, einfache Fragen stellen.

Also ich meld mich morgen nochmal!
 
Zurück