2013-08-01 43 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') ,并且它达到了最大限度的日期,所以它会带来最后一次真正检查每辆车的情况。然后,就有加入该州的日期。根据我的理解,这就是你想要的,对吧?