我想让两列显示基本上从一个领域;一个具有当前计划值,另一个具有下表结构的上一个计划。我只想选择statusid为!=2(记录计数=3)。并显示statusid=2的prevplan列。
想要一个如下的输出。
已尝试的查询
我使用了这些表的常规内部联接和外部apply(使用createddate desc排序,因为有更多的旧值)来获取prevplan。但它正在用相同的值更新整个prevplan列。返回的记录数为3,这是正确的。
OUTER APPLY
(
SELECT TOP 1
PlanPrev.Id
,PlanPrev.[Name]
FROM
Plans PlanPrev
inner join Trials tPrev on tPrev.PlanId = PlanPrev.Id
WHERE
tPrev.StatusId = 2
ORDER BY
tPrev.CreatedDate Desc
) AS PlanPrev
所以我在下面使用了一个cte,它正在更新,但是它返回的是所有6条记录,而不是3条。
WITH ContractsCTE (ContractId, CurrentPlan, PrevPlan)
AS
(
Select ContractId, p.[Name] as CurrentPlan, p.[Name] as PrevPlan
from Trials t
inner join Contracts c on c.Id = t.ContractId
inner join Plans p on t.PlanId = p.Id
where t.StatusId != 2
)
select ContractId, cte.CurrentPlan, p.[Name] as PrevPlan
from ContractsCTE cte
left join Trials t1 on cte.ContractId = t1.ContractId
left join Contracts c1 on c1.Id = t1.ContractId
left join Plans p1 on t1.PlanId = p1.Id
and t1.StatusId = 2
Order by CreateDate desc;
有没有一种方法可以在不使用任何临时表/更新查询的情况下实现它?任何帮助都将不胜感激。
1条答案
按热度按时间wi3ka0sx1#
我们可以先把以前的计划细节分开,然后再使用。
我稍微修改了cte的第二部分如下:
db<>在这里摆弄。