Как изменить имя столбца, когда мы используем регистр?Запрос SQL Server - PullRequest
3 голосов
/ 16 июня 2019

Я пытаюсь получить результат в одной строке с помощью оператора 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 ]

1 голос
/ 16 июня 2019

Вы можете попробовать это:

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
1 голос
/ 16 июня 2019

Одним из способов является использование условного агрегирования:

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.

...