2013-08-01 104 views
18

我是新來的網站,我需要你們的幫助。以下是我可以在本網站運行的模式http://sqlfiddle.com/#!3/134c3。我的數據庫的名稱是車輛檢查。我的問題是在這個模式之後。來自其他表的SQL IF條件

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

澄清事情。我們向駕駛員發放車票時有兩種情況。

  1. 當檢查車輛並發現A類或B類的任何物品有缺陷時(勾選「是」)。該票的狀態是OPEN。另一方面,如果A類和B類的所有項目都勾選「否」,則表示沒有發現缺陷。票狀態爲CLOSE。最後,C類或(交通違章)項下的項目打勾N/A。這意味着它僅僅是一個車輛檢查

  2. 條件2是車輛由於交通違規(例如過度加速)而停車的地方。車輛將不會被檢查,這張簽發票的區別是所有屬於A類和B類的項目都打勾或標記爲「不適用」,而C類則打勾爲「是」或「否」。

現在我有下面這SQL代碼可以在模式上面使用它會提取車輛在其MAX(EventTime)與相應的查詢狀態。

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 

結果:

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

,因爲在這個特別的日子沒有檢查都只有司機被抓的超速(參見上面的架構)和項目下的類這是不是正確的A和B標記爲N/A。

正確的結果應該是退後一步,即2013年7月1日,並且票據狀態是開放的,因爲它是一個明確的檢查。 A類和B類下的物品被檢查並發現TIRES有缺陷,制動系統沒有缺陷。

不知怎的,我在想如果Event.TicketStatus = CLOSE,它會檢查它是否因爲檢查或關閉而關閉,因爲它違反了交通。

+0

您可以使用'* italic *'或'** bold **'來強調單詞。 – GolezTrol

+4

對於新手來說,這是一個很好的問題... – ganders

+0

你是否需要更改where子句來檢查[index] = 2的位置? – ganders

回答

1

試試這個。

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來限制結果,謝謝您的代碼,但是當我在所述PlateNo上添加其他數據(這是2013年7月3日的另一個檢查或EventTime)時出現問題,鏡子和擋風玻璃= YES(意思是發現缺陷)。 TicketStatus已打開。當我運行你的代碼兩個相同的PlateNo在他們不同的EventTime上的行是結果。我想得到的是最大值(EventTime),其結果是2013年7月3日的檢查結果 – user2642629

+0

@ user2642629對不起。根據您的需求編輯我的答案。 – seekerOfKnowledge

+0

@ user2642629經過一些適當的測試後,再次嘗試。 – seekerOfKnowledge

1

我認爲你可以解決這個問題是這樣:

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 

子查詢過濾的1級和2級(檢查)的所有事件,並在那裏發生了一些事情(<> 'N/A') ,並且它達到了最大限度的日期,所以它會帶來最後一次真正檢查每輛車的情況。然後,就有加入該州的日期。根據我的理解,這就是你想要的,對吧?