Sql server 使用case时如何更改列名?SQL Server查询

Sql server 使用case时如何更改列名?SQL Server查询,sql-server,tsql,sql-server-2012,case,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

我尝试使用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在团队领导列中显示createdon时间,或者如果review role 4在program manager列中显示createdon时间,我希望在一行中获得结果

希望你的建议


谢谢

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

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
获取
大小写表达式的值
,因为在两个值之间使用
max
,其中一个值为
null
,另一个值将是由
max
聚合函数选择的值。

您可以尝试以下操作:

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

是的,它可以工作,但是你能解释一下查询中的最大行数吗?当然,我已经在我的答案中添加了一些解释。@Doc如果我的解决方案如你所料有效,请不要忘记向上投票并将其标记为答案。谢谢我尝试了你的解决方案这里面有错误query@Doc请分享错误信息,以便我可以帮助您解决此问题。我根据我表格的列编辑了您的答案。现在,它工作正常。审查角色不具备产生预期结果的条件。嗯,我正在使用zohar解决方案。@Doc由于您是Stackoverflow新手,我需要说的是,如果您发现zohar的答案是您正在寻找的解决方案,那么您应该将其标记为答案,但是您可以对任何其他正确答案进行投票,但不能对您正在寻找的答案进行投票。