我正在尝试使用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然后在程序管理者列中显示了创建时间,我想在一行中获得结果
希望您的建议
谢谢
答案 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