2017-06-07 2 views
0

ich eine Datenbank von "Reisen" mit dem folgendenSQL - 1 Spalte Zweimal in der SELECT-Anweisung für verschiedene Werte

TripParent

  • Id
  • DrivingCompany
  • Kunden
  • erstellt habe

TripDetails

  • Id
  • Destination
  • PlannedArrivalDate

StatusLog

  • Id
  • CatStatusId (Kommt aus einer anderen Tabelle nur mit den Namen)
  • DateTimeModified

Lassen Sie mich die Tabellen erklären, zuerst versteckte ich andere Felder, um es einfach zu halten, die "Eltern" Tabelle hat viele TripDetails, so ist es nur eine Zusammenfassung für die vielen "Details" es hat. Die TripDetails Tabelle 1 Zeile für 1 Ziel, sagen wir die Reise wird von A nach C, dann haben wir eine Zeile für jeden "Stopp" (A, B, C). Und dann haben wir die StatusLog-Tabelle, die viele Zeilen für jede "TripDetails" hat.

Das Problem ist, ich brauche eine gespeicherte Prozedur, die DrivingCompany, Client, PlannedArrivaldate, RealArrivalDate und RealDepartureDate zurückgibt.

Die "Real Dates" stammen aus der StatusLog-Tabelle. Status 1 bedeutet, dass der Lkw das Ziel (A/B/C) erreicht hat und der Status 2 bedeutet, dass er diesen Standort verlassen hat.

Bisher habe ich folgendes

SELECT 
    TP.DrivingCompany, TP.Client, TD.PlannedArrivalDate, 
    'Real Arrival Date' = CASE SL.CatStatusId 
          WHEN 1 THEN SL.DateTimeModified 
          ELSE NULL 
          END, 
    'Real Departure Date' = CASE SL.CatStatusId 
           WHEN 2 THEN SL.DateTimeModified 
           ELSE NULL 
          END 
FROM 
    TripParent TP 
JOIN 
    TripDetails TD ON TD.TripParentId = TE.Id 
JOIN 
    StatusLog SL ON SL.TripDetailsId = TD.Id 
GROUP BY 
    TP.Id 
ORDER BY 
    TD.Id 

wird mit dem CASE der richtige Weg, um die gleiche Spalte zweimal in der SELECT-Anweisung zu zeigen? Ich denke, ich bin auf dem richtigen Weg, aber ich kann nicht gruppieren von TP.Id und ich muss auch zeigen alle Zeilen, die von dieser Abfrage gehen, Es zeigt nicht die "TripDetails", die kein " StatusLog "Zeile, weil sie nicht angekommen sind.

Jede Hilfe ist willkommen

Antwort

0

Try this:

SELECT TP.Id, 
     TP.DrivingCompany, 
     TP.Client, 
     TD.PlannedArrivalDate, 
     'Real Arrival Date' = CASE SL.CatStatusId 
           WHEN 1 THEN SL.DateTimeModified 
           ELSE NULL 
          END, 
     'Real Departure Date' = CASE SL.CatStatusId 
           WHEN 2 THEN SL.DateTimeModified 
           ELSE NULL 
           END 
    FROM  TripParent TP 
     JOIN TripDetails TD ON TD.TripParentId = TE.Id 
    LEFT JOIN StatusLog SL ON SL.TripDetailsId = TD.Id 
GROUP BY TP.Id, 
      TP.DrivingCompany, 
      TP.Client, 
      TD.PlannedArrivalDate 
ORDER BY TD.Id 

Sie so, wie Sie CASE verwenden, wenn völlig in Ordnung, ja. Spalten, nach denen Sie gruppieren möchten, müssen in SELECT enthalten sein. Die Verwendung eines LINKEN JOIN für die Protokolleinträge stellt sicher, dass Sie auch Zeilen ohne entsprechendes Protokoll erhalten.

Bei der Gruppierung muss jede angezeigte Spalte entweder in der GROUP BY-Klausel oder in einer Aggregatfunktion in SELECT enthalten sein. Sie müssen also darüber nachdenken, warum Sie gruppieren, möchten Sie eine Summe erstellen, zählen, ...? >> Ändern Sie die beiden CASE-Spalten entsprechend.

+0

Danke, das LINKE JOIN gibt mir die Zeilen auch wenn es kein Protokoll gibt.Über die GROUP-Klausel, selbst wenn ich die TP.Id in die SELECT setzen, erhalte ich diesen Fehler: ** Spalte 'TP.DrivingCompany' ist in der Auswahlliste ungültig, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel. ** Dies ist ein Beispiel für meine [DATEN] (https://i.redd.it/vnlkrhhqgf2z.png) Die 2 letzten Zeilen sollten in 1 angezeigt werden, um das Real Arrival Date und Echtes Abfahrtsdatum zusammen – Martin

+0

Siehe geänderte Antwort. – IngoB

Verwandte Themen