Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三表SQL查询_Sql_Sql Server - Fatal编程技术网

三表SQL查询

三表SQL查询,sql,sql-server,Sql,Sql Server,我有一个表(车辆),其中包含车辆列表 VehicleID PlateNo CurrentDriver 我还有一个表(历史记录),其中包含车辆的驾驶员历史记录: HistoryID VehicleID ReceivedDate (vehicle receiving date) DriverName RepairID VehicleID RepairDate RepairCost 我还有另一张表(修理),其中包含所有车辆的修理: HistoryID VehicleID ReceivedDate

我有一个表(车辆),其中包含车辆列表

VehicleID
PlateNo
CurrentDriver
我还有一个表(历史记录),其中包含车辆的驾驶员历史记录:

HistoryID
VehicleID
ReceivedDate (vehicle receiving date)
DriverName
RepairID
VehicleID
RepairDate
RepairCost
我还有另一张表(修理),其中包含所有车辆的修理:

HistoryID
VehicleID
ReceivedDate (vehicle receiving date)
DriverName
RepairID
VehicleID
RepairDate
RepairCost
使用SQL Server并基于历史记录表,我希望获得给定DriverName两个日期之间的所有RepairCost值

例如,我想获得2013年1月1日至2013年5月1日期间驾驶员“John Doe”的所有维修成本值,该驾驶员在该期间被分配到三辆不同的车辆

到目前为止,我的问题是:

SELECT H.DriverName, R.RepairCost, R.RepairDate
  FROM Repairs AS R 
 INNER JOIN Vehicles AS V ON R.VehicleID = V.VehicleID 
 INNER JOIN History H ON H.VehicleID = V.VehicleID 
 WHERE H.DriverName = 'John' 
   AND R.RepairDate BETWEEN '01.01.2013' AND '04.01.2013'
还有一些示例数据

问题似乎是所有的结果我都得到了两次

稍后编辑: 我目前的进展:

DECLARE @Driver varchar(50),@StartDt datetime, @EndDt datetime

SELECT @Driver = 'John Doe',@StartDt = '20130101' ,@EndDt = '20130501'

;With VehicleAllocation
AS
(
SELECT h.*,h1.ChangeDate
FROM History h
OUTER APPLY (SELECT MIN(ReceivedDate) AS ChangeDate
FROM History
WHERE VehicleID = h.VehicleID
AND DriverName <> h.DriverName
AND ReceivedDate > h.ReceivedDate
)h1
WHERE h.DriverName = @Driver
)
SELECT *
FROM VehicleAllocation h
INNER JOIN Repairs r
ON r.VehicleID = h.VehicleID
WHERE DriverName = @Driver
AND RepairDate > = @StartDt
AND RepairDate < @EndDt + 1
AND RepairDate BETWEEN h.ReceivedDate AND COALESCE(h.ChangeDate,RepairDate)
“修理”表

RepairDate RepairCost
05.11.2013 2615.30
14.11.2013 135.66
16.11.2013 4913.04
18.11.2013 538.92
21.11.2013 152.48
23.11.2013 5946.89
26.11.2013 3697.64
27.11.2013 734.01
30.11.2013 279.62
查询结果

RepairDate RepairCost
07.11.2013 380.00
14.11.2013 135.66
16.11.2013 4913.04
16.11.2013 4913.04
21.11.2013 152.48
27.11.2013 734.01
从查询结果中可以看到,第3行和第4行的值/日期相同。 查询时间间隔为2013年1月1日至2013年12月31日

另外,如果我想从不同的表中得到不同列的总和,该怎么办? 例如,“修理”表中的“总和”列、“轮胎”表中的“总和”列

我如何改编剧本


谢谢

如果将HistoryID添加到查询中,您会注意到行不是重复的,但它们具有不同的HistoryID,请尝试此查询

SELECT H.DriverName, R.RepairCost, R.RepairDate , H.HistoryID
FROM
    Repairs AS R
    INNER JOIN Vehicles AS V ON R.VehicleID=V.VehicleID
    INNER JOIN History H ON H.VehicleID=V.VehicleID 
WHERE H.DriverName='John' AND R.RepairDate BETWEEN '01.01.2013' AND '04.01.2013'
所以我认为你的数据有问题


您可以使用
DISTINCT
消除这些重复行,但我建议您仔细检查历史记录表数据

我不知道为什么要将车辆表包括在查询中,因为您不想从中获得任何信息

您将获得“双重”结果,因为您将每次维修(例如,1月15日的维修)与具有相同车辆id的所有记录(其中有三次)相匹配。其中两个匹配是针对驱动John的,所以你得到两个结果

您想要的是仅匹配根据历史记录表在维修时为驱动器的驱动器

因此,我首先将每个维修日期与历史记录表中实际匹配的ReceiveDate进行匹配:

SELECT R1.Repairdate, Max(H1.ReceivedDate) as ReceivedDate
FROM Repairs R1
JOIN History H1 
  ON R1.VehicleID=H1.VehicleID 
 AND H1.ReceivedDate < R1.RepairDate

您可以发布您尝试的查询吗?你犯了什么错误?结果与预期的不同吗?到目前为止,我已经使用SQL Fiddle向您展示了我的查询:结果似乎翻了一番。您知道吗?我知道DISTINCT,但我想从修复表中获取所有值。谢谢,oerkelens。我添加了Vehicle表,因为我想得到车牌号,不同表中不同车辆的成本总和。这是问题的第二部分。我已经添加了H.VehicleID的一个组,但它只适用于修理表。我该怎么做?我不确定我是否了解更多表中的
金额,因为我只在1个表中看到成本。。。我认为,如果您想要每辆
车辆的总成本,您应该使用不同的查询-此查询为您提供每名驾驶员的成本。除非您想要每个驾驶员每辆车的成本,在这种情况下,您确实可以按车辆ID分组。但我认为,你从其他表格中获得的其他成本并不是那么容易增加的。也许在一个新问题中更好地表述这一点:)数据库有其他表,类似于维修表,其中也包含成本(轮胎表、保险表等)。我想生成一个报告,其中包含每个驾驶员(而不是每辆车)从这些表中获得的总值。为此,我如何调整您提供的查询。。最终报告应包含(根据给定的驾驶员和期间)以下列:车辆编号|总维修成本|总轮胎成本|…您必须以类似方式将它们(前提是它们每次都有日期)链接到历史记录表。这将导致一个非常复杂的查询-您可能会考虑创建一个UDF,它给您在给定日期的车辆的驱动程序名称,而您甚至可以将它作为非持久化计算列添加到您的修复(和其他表)中,这样您的查询就容易得多了:我以前从未使用过UDF。我认为查询的H2部分可能是一个函数。我尝试了一些查询,但我得到了错误:(如何定义一个返回表的函数?
DRIVERNAME  VEHICLEID   REPAIRDATE  REPAIRCOST
John    1   January, 15 2013 00:00:00+0000  10
Ryan    2   January, 18 2013 00:00:00+0000  15
Ryan    2   January, 22 2013 00:00:00+0000  15
John    1   February, 03 2013 00:00:00+0000 5
Ryan    2   February, 05 2013 00:00:00+0000 25
John    1   February, 10 2013 00:00:00+0000 10
John    2   February, 26 2013 00:00:00+0000 10
Ryan    1   March, 01 2013 00:00:00+0000    100
John    2   March, 03 2013 00:00:00+0000    30
John    2   March, 08 2013 00:00:00+0000    5
Ryan    1   March, 10 2013 00:00:00+0000    45
Ryan    1   March, 17 2013 00:00:00+0000    25
Ryan    2   March, 25 2013 00:00:00+0000    10
Ryan    2   March, 28 2013 00:00:00+0000    30