SQL-1列在SELECT语句中为不同的值设置两次

SQL-1列在SELECT语句中为不同的值设置两次,sql,sql-server,database,relationship,Sql,Sql Server,Database,Relationship,我创建了一个“trips”数据库,其中包含以下内容 三亲 身份证 驾驶公司 客户 TripDetails 身份证 目的地 计划到达日期 状态日志 身份证 CatStatusId(来自另一个仅包含名称的表) DateTimeModified 让我解释一下这些表,首先我隐藏了另一个字段以保持简单,“父”表有许多详细信息,因此它只是对它所具有的许多“详细信息”的总结。TripDetails表的1行对应1个目的地,假设旅行是从A到C,那么每个“站点”(A、B、C)都有一行。 然后我们得到了S

我创建了一个“trips”数据库,其中包含以下内容

三亲

  • 身份证
  • 驾驶公司
  • 客户
TripDetails

  • 身份证
  • 目的地
  • 计划到达日期
状态日志

  • 身份证
  • CatStatusId(来自另一个仅包含名称的表)
  • DateTimeModified
让我解释一下这些表,首先我隐藏了另一个字段以保持简单,“父”表有许多详细信息,因此它只是对它所具有的许多“详细信息”的总结。TripDetails表的1行对应1个目的地,假设旅行是从A到C,那么每个“站点”(A、B、C)都有一行。 然后我们得到了StatusLog表,每个“TripDetails”都有许多行

问题是,我需要一个存储过程来返回驱动公司、客户机、PlannedArrivalDate、RealArrivalDate和RealDepartureDate

“实际日期”来自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
在SELECT语句中使用大小写是否正确地显示同一列两次?我认为我的思路是正确的,但我不能按TP.Id分组,我还需要显示所有行,通过这个查询,它不会显示没有“StatusLog”行的“TripDetails”,因为它们尚未到达

感谢您的帮助

尝试以下方法:

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
它们是您使用案例的方式,如果非常好,是的。要按其分组的列必须包含在SELECT中。对日志条目使用左连接可以确保也可以获得没有相应日志的行


分组时,显示的每一列必须包含在GROUP BY子句中,或者包含在SELECT中的聚合函数中。因此,您必须考虑为什么要分组,是否要创建一个总和、计数等?>>相应地更改两个CASE列。

谢谢,即使没有日志,左连接也会为我提供行。关于GROUP子句,即使我将TP.Id放在SELECT中,也会出现以下错误:“TP.DrivingCompany”列在SELECT列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。这是我的一个示例,最后两行应显示在1中,以将实际到达日期和实际出发日期放在一起参见更改的答案。