我使用以下
创建了一个“旅行”数据库TripParent
TripDetails
StatusLog
让我解释一下这些表,首先我隐藏了另一个字段以保持简单,“父”表有很多TripDetails,所以它只是它的许多“详细信息”的摘要。 TripDetails表为1个目的地的1行,假设Trip从A到C,那么我们每个“stop”(A,B,C)都有一行。 然后我们得到了StatusLog表,每个“TripDetails”都有很多行。
问题是,我需要一个存储过程来返回DrivingCompany,Client,PlannedArrivalDate,RealArrivalDate和RealDepartureDate。
“Real Dates”来自StatusLog表。状态1表示卡车已到达目的地(A / B / C),状态2表示已离开该位置。
到目前为止,我得到了以下内容
SELECT
TP.DrivingCompany, TP.Client, TD.PlannedArrivalDate,
'Real Arrival Date' = CASE SL.CatStatusId
WHEN 1 THEN SL.DateTimeModified
ELSE NULL
END,
'Real Departure Date' = CASE SL.CatStatusId
WHEN 2 THEN SL.DateTimeModified
ELSE NULL
END
FROM
TripParent TP
JOIN
TripDetails TD ON TD.TripParentId = TE.Id
JOIN
StatusLog SL ON SL.TripDetailsId = TD.Id
GROUP BY
TP.Id
ORDER BY
TD.Id
使用CASE是否在SELECT语句中两次显示相同列的正确方法?我认为我在正确的轨道上,但我不能按TP.Id分组,我也需要显示所有行,按此查询,它不显示没有“的”TripDetails“ StatusLog“因为它们尚未到达而排。
感谢任何帮助
答案 0 :(得分:0)
试试这个:
SELECT TP.Id,
TP.DrivingCompany,
TP.Client,
TD.PlannedArrivalDate,
'Real Arrival Date' = CASE SL.CatStatusId
WHEN 1 THEN SL.DateTimeModified
ELSE NULL
END,
'Real Departure Date' = CASE SL.CatStatusId
WHEN 2 THEN SL.DateTimeModified
ELSE NULL
END
FROM TripParent TP
JOIN TripDetails TD ON TD.TripParentId = TE.Id
LEFT JOIN StatusLog SL ON SL.TripDetailsId = TD.Id
GROUP BY TP.Id,
TP.DrivingCompany,
TP.Client,
TD.PlannedArrivalDate
ORDER BY TD.Id
如果完全没问题,他们会使用CASE,是的。要分组的列必须包含在SELECT中。对日志条目使用LEFT JOIN可确保您获得没有相应日志的行。
分组时,显示的每一列必须包含在GROUP BY子句中,或者包含在SELECT中的聚合函数中。所以你必须考虑为什么要分组,你想创建一个总和,数,......? >>相应地更改两个CASE列。