我是网站的新手,我需要你们的帮助。以下是我可以在此网站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')
澄清事情。我们向司机发票时有两个条件。
检查车辆时,发现A类或B类任何物品有缺陷(勾选“是”)。票证状态为OPEN。另一方面,如果A类和B类的所有项目均为“否”,则表示未发现任何缺陷。票证状态为CLOSE。最后,C类或(交通违规)下的项目是N / A.意味着它仅仅是车辆检查
第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类项目,发现TIRES有缺陷,BRAKING SYSTEM没有缺陷。
不知怎的,我正在考虑代码,如果Event.TicketStatus = CLOSE,它将检查它是否接近,因为它被检查或关闭,因为它违反了交通。
答案 0 :(得分: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
答案 1 :(得分: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类中的所有事件(检查)以及发生了什么事情(&lt;&gt;'N / A'),并且它获得了它的最大日期,因此它将带来真实的最后一次出现检查每辆车。然后,有一个联接,以便在该日期带来州。根据我的理解,这就是你想要的,对吗?