車両のリストを含むテーブル (Vehicles) があります。
VehicleID
PlateNo
CurrentDriver
車両のドライバー履歴を含むテーブル (履歴) もあります。
HistoryID
VehicleID
ReceivedDate (vehicle receiving date)
DriverName
すべての車両の修理を含む別のテーブル (Repairs) があります。
RepairID
VehicleID
RepairDate
RepairCost
SQL Server を使用し、History テーブルに基づいて、特定の DriverName の 2 つの日付間のすべての RepairCost 値を取得したいと考えています。
たとえば、2013 年 1 月 1 日から 2013 年 5 月 1 日の間に 3 台の異なる車両に割り当てられたドライバー 'John Doe' のすべての RepairCost 値を取得したいと考えています。
これまでの私のクエリは次のとおりです。
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'
SQL Fiddleにもいくつかのサンプル データがあります。
問題は、すべての結果を 2 回取得していることです。
後で編集:これまでの私の進捗状況:
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)
「AND DriverName <> h.DriverName」という行に問題があることがわかりました。その行が役立つのはなぜですか?履歴テーブルに同じドライバー名が次々とあった場合、そのドライバー名の最後の納車日までスキップされました。
サンプルデータ:
「歴史」表
ReceivedDate DriverName
04.11.2013 Mike
13.11.2013 Dan
15.11.2013 Dan
17.11.2013 Ryan
20.11.2013 Dan
22.11.2013 Ryan
25.11.2013 Mike
26.11.2013 Dan
29.11.2013 Ryan
04.12.2013 Dan
「修理」表
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 日でした。
また、異なるテーブルから異なる列の SUM を取得したい場合はどうすればよいでしょうか? たとえば、「Repairs」テーブルの SUM(Total) 列、「Tires」テーブルの SUM(Value) 列などです。
スクリプトをどのように適応させることができますか?
ありがとう!