使用案例时如何更改列名? SQL Server查询

时间:2019-06-16 06:48:38

标签: sql-server tsql sql-server-2012 case

我正在尝试使用case语句在一行中显示结果,它向我显示正确的结果,但在两行中让我向您显示我的查询,

select  
    v.Id,
    v.VisitNumber,
    v.EndTime as VisitEndTime,
    case when srh.ReviewerRole = 2 then srh.CreatedOn end as TeamLeaderApproval,
    case when srh.ReviewerRole = 4 then srh.CreatedOn end as ProgramManagerApproval
from
    visit v 
inner join 
    SurveyReviewHistory srh on v.Id = srh.VisitId 
where 
    v.Status = 5 
    and v.Id = 5957

它以这种格式显示结果,

Id  VisitNumber VisitEndTime TeamLeaderApproval ProgramManagerApproval
5957 Visit_U_6   2019-05-26     2019-05-26             NULL
5957 Visit_U_6   2019-05-26     NULL                2019-05-26 

如果Reviewrole 2然后在团队负责人列中显示了创建时间,或者如果审查角色4然后在程序管理者列中显示了创建时间,我想在一行中获得结果

希望您的建议

谢谢

2 个答案:

答案 0 :(得分:1)

一种方法是使用条件聚合:

select  v.Id,
        v.VisitNumber,
        v.EndTime as VisitEndTime,
        max(case when srh.ReviewerRole = 2 then srh.CreatedOn end) as TeamLeaderApproval,
        max(case when srh.ReviewerRole = 4 then srh.CreatedOn end) as ProgramManagerApproval
from  visit v 
inner join SurveyReviewHistory srh 
    on v.Id = srh.VisitId 
where v.Status = 5 
and v.Id = 5957
group by v.Id, v.VisitNumber, v.EndTime

这个想法很简单-您可以对所有在原始查询中给出相同结果的列进行分组。
然后,您使用max来获取case expression的值,因为当您在两个值之间使用max时,其中一个值是null,另一个值将是由max聚合函数选择的值。

答案 1 :(得分:1)

您可以尝试以下方法:

SELECT DISTINCT K.Id,
       K.VisitNumber,
       K.VisitEndTime,
       FIRST_VALUE(K.TeamLeaderApproval) OVER(PARTITION BY K.Id,K.VisitNumber, K.VisitEndTime ORDER BY K.TeamLeaderApproval DESC) AS TeamLeaderApproval,
       FIRST_VALUE(K.ProgramManagerApproval) OVER(PARTITION BY K.Id,K.VisitNumber, K.VisitEndTime ORDER BY K.ProgramManagerApproval DESC) AS ProgramManagerApproval
From  (
   select  
     v.Id,
     v.VisitNumber,
     v.EndTime as VisitEndTime,
     case when srh.ReviewerRole = 2 then srh.CreatedOn end as TeamLeaderApproval,
     case when srh.ReviewerRole = 4 then srh.CreatedOn end as ProgramManagerApproval
   from visit v 
      inner join 
          SurveyReviewHistory srh on v.Id = srh.VisitId 
    where 
       v.Status = 5 and v.Id = 5957
  ) as K