2013-08-01 11 views
18

Sono nuovo qui nel sito e ho bisogno di un aiuto da voi ragazzi. Di seguito è lo schema che ho che può essere eseguito in questo sito http://sqlfiddle.com/#!3/134c3. Il nome del mio database è ispezioni del veicolo. La mia domanda è dopo questo schema.Condizione SQL IF da altre tabelle

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') 

Per chiarire le cose. Ci sono due condizioni quando emettiamo il ticket per il driver.

  1. Quando il veicolo viene ispezionato e rilevato difetti su qualsiasi articolo di Classe A o B (spuntare 'sì'). Lo stato del ticket è OPEN. D'altra parte, se tutti gli articoli di Classe A e B sono spuntati "No", significa che non si riscontrano difetti. Lo stato del ticket è CHIUSO. Infine gli articoli di Classe C o (violazioni del codice stradale) sono spuntati N/A. Si tratta di una semplice ispezione del veicolo

  2. La condizione n. 2 è il luogo in cui il veicolo viene fermato a causa di violazioni del codice stradale (ad esempio, eccesso di velocità). Il veicolo NON sarà ispezionato, La distinzione di questo biglietto emesso è che tutti gli articoli di Classe A e B sono spuntati o segnano "N/A" mentre sulla Classe C è spuntato "sì" o "no".

ora ho questo codice SQL in basso che può essere utilizzato nello schema sopra dove si estrarrà i veicoli sulla sua MAX(EventTime) con corrispondenti Stato del Ticket.

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 

Risultato:

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

QUESTO NON È IL CORRETTO poiché in questa data particolare ci sono stati nessuna ispezione a tutti solo il driver è stato catturato per superamento di velocità (vedi lo schema sopra) e articoli in classe A e B sono contrassegnati N/A.

Il risultato corretto dovrebbe essere un passo indietro che è il 1 luglio 2013 e lo stato del biglietto è APERTO poiché era un'ispezione chiara. Gli articoli di categoria A e B sono ispezionati e trovati PNEUMATICI sono difettosi e il SISTEMA DI FRENATURA NON ha difetti.

In qualche modo stavo pensando al codice dove Event.TicketStatus = CLOSE esaminerà se è chiuso perché è stato ispezionato o chiuso perché è una violazione del traffico.

+0

È possibile utilizzare '* italic *' o '** bold **' per enfatizzare le parole. – GolezTrol

+4

Domanda ben formata per un principiante ... – ganders

+0

Hai bisogno di cambiare la tua clausola where per verificare dove [index] = 2? – ganders

risposta

1

Prova questo.

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, grazie per il tuo codice ma c'è un problema quando ho aggiunto ulteriori dati su detto PlateNo che è un'altra ispezione o EventTime che è il 3 luglio 2013 , Specchi e Parabrezza = SI (significato trovato un difetto). E TicketStatus è aperto.Quando eseguo il codice, due risultati dello stesso PlateNo sul loro diverso EventTime sono il risultato. Quello che voglio ottenere è il Max (EventTime) che il risultato è l'ispezione del 3 luglio 2013 – user2642629

+0

@ user2642629 Scusaci. Modificato la mia risposta per le tue esigenze. – seekerOfKnowledge

+0

@ user2642629 dopo alcuni test appropriati, il prossimo tentativo. – seekerOfKnowledge

1

Penso che si possa risolvere questo in questo modo:

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 

La sottoquery viene filtrare tutti gli eventi in classe 1 e 2 (ispezione) e dove è successo qualcosa (<> 'N/A') e sta ottenendo la sua data massima, quindi porterà l'ultima occorrenza di una vera ispezione di ogni auto. Quindi, c'è il join per portare lo stato in quella data. Da quello che ho capito, è quello che vuoi, giusto?

Problemi correlati