SQL - 1 SELECT语句中的列两次,用于不同的值

时间:2017-06-07 21:35:16

标签: sql sql-server database relationship

我使用以下

创建了一个“旅行”数据库

TripParent

  • 编号
  • DrivingCompany
  • 客户端

TripDetails

  • 编号
  • 目标
  • PlannedArrivalDate

StatusLog

  • 编号
  • CatStatusId(来自另一个名字的表格)
  • DateTimeModified

让我解释一下这些表,首先我隐藏了另一个字段以保持简单,“父”表有很多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“因为它们尚未到达而排。

感谢任何帮助

1 个答案:

答案 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列。