2016-11-17 7 views
1

Apologies für den großen Code-Schnipsel, aber ich brauche, um sie anzuzeigen, die entsprechenden Ermittlungen zu zeigen, die ich zusammengestellt.eine Abfrage Kombination zeigt falsche Ergebnisse

Im Folgenden werden zwei separate Fragen haben, eine Prüfung für die Besatzungsmitglieder in einem bestimmten Flug vom Staging Schema (Staging.SabreAssignedCrew) Tabelle und die andere ist ein Vergleich zu den Daten Schema Tabellen, in denen nach dem alle relevanten Tabellen Verbindungs zusammen, erhalte ich die Crew Informationen pro Flug:


Staging.SabreAssignedCrew Tisch

SELECT 
* 
, Airline + CAST(FlightNumber AS VARCHAR) + Suffix AS StagingFlight 
, ROW_NUMBER() OVER(PARTITION BY Airline + CAST(FlightNumber AS VARCHAR) + Suffix ORDER BY UpdateId DESC) AS StageRowNumber 
FROM Staging.SabreAssignedCrew 
WHERE Airline + CAST(FlightNumber AS VARCHAR) + Suffix = 'LS627' AND DepartureDate = '2016-09-04' 

Data Schema Tabellen

SELECT 
cd.CrewUpdateID 
, cd.IsPassive 
, cd.CrewBase 
, cd.CrewCategory 
, cd.CrewType 
, cd.EmployeeNumber 
, cd.FirstName 
, cd.LastName 
, c.UpdateID 
, c.LegKey 
, c.UpdateReceived 
, DataFlight 
, l.ScheduledDepartureDate 
, l.ScheduledDepartureAirport 
FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber FROM Data.Crew) c 
INNER JOIN 
Data.CrewDetail cd 
ON c.UpdateID = cd.CrewUpdateID 
AND cd.IsPassive = 0 
AND RowNumber = 1 
INNER JOIN 
(SELECT *, Carrier + CAST(FlightNumber AS VARCHAR) + Suffix AS DataFlight FROM Data.Leg) l 
ON c.LegKey = l.LegKey 
WHERE DataFlight = 'LS627' AND ScheduledDepartureDate = '2016-09-04' 

Die Ergebnisse beiden Abfragen zeigen, dass es 6 Besatzungsmitglieder (6 Zeilen) im Flug:

enter image description here

Nun, was ich zu tun versuchen, ist die Kombination der Abfragen zu einer Verwendung und Durchführung einer SUM, um sicherzustellen, dass die richtigen Besatzungsmitglieder an Bord des Fluges sind. Allerdings sind die Ergebnisse falsch, wie es unten outputd:

enter image description here

Wir wissen, gibt es 6 Besatzungsmitglieder im Flug, so sollte es für die Staging Schema 2 StagingCabinCrew und 4 StagingCockpitCrew und genau die gleiche Anzeige Werte für die Daten Schema. Dies alles wird durch das CrewType Feld von beiden bestimmt Staging und Daten Schematische.

Ich gehe davon aus, dass ich in meiner kombinierten Abfrage etwas falsch mache, aber ich bin mir nicht sicher, was es ist, wenn die zwei oben genannten Abfragen in der kombinierten Abfrage die korrekten Ergebnisse anzeigen, aber das Ausführen der gesamten kombinierten Abfrage das falsche anzeigt Wert. Was muss behoben werden?

WITH CTE AS (
SELECT 
cd.CrewUpdateID 
, cd.IsPassive 
, cd.CrewBase 
, cd.CrewCategory 
, cd.CrewType 
, cd.EmployeeNumber 
, cd.FirstName 
, cd.LastName 
, c.UpdateID 
, c.LegKey 
, c.UpdateReceived 
, DataFlight 
, l.ScheduledDepartureDate 
, l.ScheduledDepartureAirport 
FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY LegKey ORDER BY UpdateID DESC) AS RowNumber FROM Data.Crew) c 
INNER JOIN 
Data.CrewDetail cd 
ON c.UpdateID = cd.CrewUpdateID 
AND cd.IsPassive = 0 
AND RowNumber = 1 
INNER JOIN 
(SELECT *, Carrier + CAST(FlightNumber AS VARCHAR) + Suffix AS DataFlight FROM Data.Leg) l 
ON c.LegKey = l.LegKey 
WHERE DataFlight = 'LS627' AND ScheduledDepartureDate = '2016-09-04' 
) 
SELECT 
StagingFlight 
, sac.DepartureDate 
, sac.DepartureAirport 
, cte.DataFlight 
, cte.ScheduledDepartureDate 
, cte.ScheduledDepartureAirport 
, SUM(CASE WHEN sac.CREWTYPE = 'F' THEN 1 ELSE 0 END) AS StagingCabinCrew 
, SUM(CASE WHEN sac.CREWTYPE = 'C' THEN 1 ELSE 0 END) AS StagingCockpitCrew 
, SUM(CASE WHEN cte.CrewType = 'F' THEN 1 ELSE 0 END) AS DataCabinCrew 
, SUM(CASE WHEN cte.CrewType = 'C' THEN 1 ELSE 0 END) AS DataCockpitCrew 
FROM 
(
SELECT 
* 
, Airline + CAST(FlightNumber AS VARCHAR) + Suffix AS StagingFlight 
, ROW_NUMBER() OVER(PARTITION BY Airline + CAST(FlightNumber AS VARCHAR) + Suffix ORDER BY UpdateId DESC) AS StageRowNumber 
FROM Staging.SabreAssignedCrew-- 
WHERE Airline + CAST(FlightNumber AS VARCHAR) + Suffix = 'LS627' AND DepartureDate = '2016-09-04') 
sac 

LEFT JOIN CTE cte 
ON StagingFlight = DataFlight 
AND sac.DepartureDate = cte.ScheduledDepartureDate 
AND sac.DepartureAirport = cte.ScheduledDepartureAirport 
AND sac.CREWTYPE = cte.CrewType 
WHERE StagingFlight = 'LS627' AND DepartureDate = '2016-09-04' AND StageRowNumber = 1 

GROUP BY 
StagingFlight 
, sac.DepartureDate 
, sac.DepartureAirport 
, cte.DataFlight 
, cte.ScheduledDepartureDate 
, cte.ScheduledDepartureAirport 
+0

Bei begining versuchen Ihre qry viel einfacher zu machen - "Airline + CAST (Flugnummer AS VARCHAR) + Suffix" berechnet beharrte Spalte werden könnte - wird besser lesbar sein - schaffen agregation für die Besatzung (Gruppe von StagingFlight, sac.DepartureDate, sac.DepartureAirport) in temporäre Tabelle oder Sicht - Sie brauchen keine Zeilennummer in Ihrem Qry (Gruppe von wird genug sein) – Deadsheep39

+0

@ deadsheep39 Möchten Sie Ihren Kommentar als Antwort, also wenn es funktioniert, ich kann markiere es? Ich weiß, wie man Ansichten oder Temp-Tabelle tut, aber kann auch ein Beispiel einschließen, damit andere sehen können. Danke – BruceyBandit

Antwort

0
  1. erstellen Spalte für stagingflight (Sie wahrscheinlich apropriete Index verwenden). Bitte setze immer die Größe von varchar (zB varchar -> varchar (30)).

    alter table staging.sabreassignedcrew 
    add stagingflight as cast(airline + cast(flightnumber as varchar(5)) + suffix as varchar(25)) persisted 
    
  2. Ansichten erstellen.

    CREATE VIEW Staging.vw_SabreAssignedCrewCount 
    AS 
    SELECT 
        StagingFlight, 
        DepartureDate, 
        COUNT(DISTINCT CASE WHEN sac.CREWTYPE = 'F' THEN EmployeeNumber END) AS StagingCabinCrewCnt, 
        COUNT(DISTINCT CASE WHEN sac.CREWTYPE = 'C' THEN EmployeeNumber END) AS StagingCockpitCrewCnt 
    FROM Staging.SabreAssignedCrew 
    GROUP BY StagingFlight, DepartureDate 
    

Die zweite Ansicht der zweiten Tabelle.

  1. Sie rownumbers nicht benötigen, CTE. Nur einfach bei 2 gruppierten Auswahlen beitreten.
+0

Danke Deadsheep39 für Ihre Antwort, leider habe ich herausgefunden, dass ich Berechtigungen eingeschränkt habe beim Erstellen von Ansichten oder Ändern von Tabellen, so dass ich CTEs für jetzt verwenden müssen. Ich habe versucht, es in den letzten zwei Stunden zu gestalten, aber immer noch kein Glück. Hast du eine Idee, wo das Problem liegt und in der Lage sein, ein Code-Snippet einer möglichen Lösung bereitzustellen? – BruceyBandit

+0

Wenn Sie keine Berechtigung zum Erstellen von Ansichten haben, versuchen Sie, ob Sie eine temporäre Tabelle (#) erstellen können. Fügen Sie die erste Auswahl aus der Gruppe in die temporäre Tabelle und die Übersicht ein, wenn Ihre erwarteten Ergebnisse vorliegen. Wenn es in Ordnung ist, holen Sie sich die zweite Auswahl und versuchen Sie, Ihre vorläufigen Ergebnisse pro Teil zu überblicken. – Deadsheep39

Verwandte Themen