2013-08-01 7 views
18

Ich bin neu hier auf der Website und ich brauche eine Hilfe von euch. Unten ist das Schema, das ich habe, das auf dieser Seite http://sqlfiddle.com/#!3/134c3 ausgeführt werden kann. Der Name meiner Datenbank ist Fahrzeuginspektionen. Meine Frage ist nach diesem Schema.SQL IF Bedingung von anderen Tabellen

CREATE TABLE Car 
    ([CarID] varchar(36), 
    [PlateNo] varchar(6), 
    [Package] int); 

    INSERT INTO Car([CarID], [PlateNo], [Package]) 
    VALUES('A57D4151-BD49-4B44-AF10-000F1C298E05', '8112AG', 4); 

    CREATE TABLE Event  
    ([EventID] int, 
    [CarID] varchar(36), 
    [EventTime] smalldatetime, 
    TicketStatus varchar (10)) ;  

INSERT INTO Event([EventID], [CarID], [EventTime], TicketStatus) 
VALUES (1, 'A57D4151-BD49-4B44-AF10-000F1C298E05', '20130701', 'Open'), 
     (2, 'A57D4151-BD49-4B44-AF10-000F1C298E05', '20130702', 'Close') ; 

CREATE TABLE EventDefects 
    ([EventDefectsID] int, 
    [EventID] int, 
    [Status] varchar(15), 
    [DefectID] int) ; 

INSERT INTO EventDefects ([EventDefectsID], [EventID], [Status], [DefectID]) 
VALUES (1, 1, 'YES', 1), 
     (2, 1, 'NO', 2), 
     (3, 1, 'N/A', 3), 
     (4, 1, 'N/A', 4), 
     (5, 2, 'N/A', 1), 
     (6, 2, 'N/A', 2), 
     (7, 2, 'N/A', 5), 
     (8, 2, 'YES', 3), 
     (9, 2, 'NO', 4) ; 

CREATE TABLE Defects 
    ([DefectID] int, 
    [DefectsName] varchar (36), 
    [DefectClassID] int) ; 

INSERT INTO Defects ([DefectID], [DefectsName], [DefectClassID]) 
VALUES (1, 'TYRE', 1), 
     (2, 'BRAKING SYSTEM', 1), 
     (3, 'OVER SPEEDING', 3), 
     (4, 'NOT WEARING SEATBELTS', 3), 
     (5, 'MIRRORS AND WINDSCREEN', 2) ; 

CREATE TABLE DefectClass 
    ([Description] varchar (15), 
    [DefectClassID] int) ; 

INSERT INTO DefectClass ([DefectClassID], [Description]) 
VALUES (1, 'CATEGORY A'), 
     (2, 'CATEGORY B'), 
     (3, 'CATEGORY C') 

Um Dinge zu klären. Es gibt zwei Bedingungen, wenn wir ein Ticket für den Fahrer ausgeben.

  1. Wenn das Fahrzeug inspiziert wird und Defekte an Teilen der Klasse A oder B festgestellt wird (bitte 'Ja' ankreuzen). Der Ticketstatus davon ist OPEN. Wenn auf der anderen Seite alle Artikel der Klassen A und B mit "Nein" markiert sind, bedeutet dies, dass keine Mängel gefunden wurden. Der Ticketstatus ist SCHLIESSEN. Schließlich sind Punkte unter Klasse C oder (Verkehrsverstöße) Tick N/A. Bedeutung es ist eine reine Fahrzeuginspektion

  2. Bedingung Nr. 2 ist, wo Fahrzeug wegen einer Verkehrsverletzung (z. B. über Geschwindigkeitsbegrenzung) gestoppt wird. Das Fahrzeug wird NICHT inspiziert. Die Unterscheidung dieses ausgestellten Tickets ist, dass alle unter den Klassen A und B befindlichen Positionen ein Häkchen oder "N/A" haben, während in der Klasse C entweder "ja" oder "nein" markiert ist.

Jetzt habe ich diesen SQL-Code unten, dass die Verwendung im Schema oben sein kann, wo sie Fahrzeuge auf seinem MAX(EventTime) mit entsprechendem Ticket-Status extrahieren.

Select 
     PlateNo, TicketStatus, [EventTime] 
    FROM 
     (SELECT 
     ROW_NUMBER() OVER (PARTITION BY Event.CarID ORDER BY [EventTime] DESC) AS [index], 
     Event.CarID, 
     TicketStatus, 
     [EventTime], 
     plateNo 
     FROM 
     [Event] 
     Join 
     [Car] ON Event.CarID = Car.CarID) A 
    WHERE [index] = 1 

Ergebnis:

RESULT: PlateNo - 8112AG ; EventTime - July 2, 2013; TicketStatus - Close. 

DIES IST NICHT DIE RICHTIGE an diesem Datum, da es überhaupt keine Kontrolle war nur der Fahrer für Geschwindigkeitsüberschreitung (siehe Schema oben) und Artikel unter Klasse gefangen wurde A und B sind mit N/A gekennzeichnet.

Das korrekte Ergebnis sollte ein Schritt zurück sein, der 1. Juli 2013 ist und der Ticketstatus ist OPEN, da es eine klare Inspektion war. Artikel unter Kategorie A und B werden geprüft und festgestellt, dass Reifen defekt sind und das BREMSSYSTEM KEINE Mängel aufweist.

Irgendwie dachte ich Code wo, wenn Event.TicketStatus = SCHLIESSEN wird es prüfen, ob es nah ist, weil es inspiziert wurde oder schließen, weil es eine Verkehrsverletzung ist.

+0

Sie können '* italic *' oder '** bold **' zum Hervorheben von Wörtern verwenden. – GolezTrol

+4

Gut geformte Frage für einen Neuling ... – ganders

+0

Müssen Sie Ihre WHERE-Klausel ändern, um zu überprüfen, wo [Index] = 2? – ganders

Antwort

1

Versuchen Sie dies.

SELECT 
    PlateNo, 
    TicketStatus, 
    MAX(EventTime) 
FROM 
    [Event] E 
LEFT OUTER JOIN 
    [EventDefects] ED ON E.EventID = ED.EventID 
LEFT OUTER JOIN 
    [Defects] D ON ED.DefectID = D.DefectID 
LEFT OUTER JOIN 
    [Car] C ON E.CarID = C.CarID 
WHERE ED.Status = 'YES' AND D.DefectClassID <> 3 
GROUP BY PlateNo, TicketStatus 
+0

seekerOfKnowledge, danke für Ihren Code, aber es gibt ein Problem, wenn ich zusätzliche Daten auf der PlateNo hinzugefügt habe, die eine andere Inspektion oder EventTime ist, die 3. Juli 2013 ist , Spiegel und Windschutzscheibe = JA (was bedeutet, dass ein Defekt gefunden wurde). Und TicketStatus ist offen.Wenn ich Ihren Code ausführen, sind zwei zwei Zeilen derselben PlateNo auf ihrer unterschiedlichen EventTime das Ergebnis. Was ich erhalten möchte, ist die Max (EventTime), die das Ergebnis ist die 3. Juli 2013 Inspektion – user2642629

+0

@ user2642629 Sorry darüber. Bearbeitete meine Antwort für Ihre Bedürfnisse. – seekerOfKnowledge

+0

@ user2642629 nach einigen richtigen Tests, nächsten Versuch. – seekerOfKnowledge

1

Ich glaube, Sie diese auf diese Weise lösen können:

SELECT C.PlateNo, E.EventID, E.TicketStatus, E.EventTime 
FROM Car C 
INNER JOIN Event E ON C.CarID = E.CarID 
INNER JOIN (
SELECT CarID, MAX(E.EventTime) EventTime FROM Event E 
    LEFT JOIN EventDefects ED ON E.EventID = ED.EventID 
    LEFT JOIN Defects D ON ED.DefectID = D.DefectID 
      WHERE D.DefectClassID IN (1,2) AND ED.Status <> 'N/A' 
GROUP BY CarID 
) T ON E.CarID = T.CarID AND E.EventTime = T.EventTime 

Die Unterabfrage alle Ereignisse filtert in Klasse 1 und 2 (Inspektion) und wo etwas passiert (<> 'N/A') , und es wird sein maximales Datum erreicht, so wird es das letzte Vorkommen einer echten Inspektion jedes Autos bringen. Dann gibt es den Beitritt, um den Staat an diesem Datum zu bringen. Soweit ich das verstanden habe, willst du das, oder?

Verwandte Themen