18

我是这个网站的新手,我需要你们的帮助。以下是我可以在此站点http://sqlfiddle.com/#!3/134c3中运行的架构。我的数据库的名称是车辆检查。我的问题是在这个模式之后。

  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类的所有项目都打勾或标记“N/A”,而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 日,并且工单状态为 OPEN,因为这是一次明确的检查。检查 A 类和 B 类项目,发现轮胎有缺陷,制动系统没有缺陷。

不知何故,我在考虑代码,如果 Event.TicketStatus = CLOSE 它将检查它是因为它被检查而关闭还是因为它违反交通规则而关闭。

4

2 回答 2

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'),并且它正在获取它的最大日期,因此它将带来对每辆车进行真正检查的最后一次发生。然后,在那个日期加入状态。据我了解,这就是你想要的,对吧?

于 2013-08-03T18:18:06.923 回答
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
于 2013-08-01T18:57:10.163 回答