我想让数据显示在下面的父子类似关系中,其中第一行应该是父行,而后续每行应该是所有父特定列中为null的子行。
[![这是例子] [2]] [2]
在上文中,消费者99999999有2个家属22222222和33333333。
我尝试使用Lead和lag执行此操作,但这需要在CTE中进行订购。 我正在考虑查看以前的ApplicationroductID,并且每当我看到它已经改变时就会标记。所以通过这样做,我可以标记父母和孩子。 我可以通过使用临时表来解决问题,但这听起来不是一个非常好的解决方案。 有没有更好的方法可以让你们想到这个。我想让数据采用上述格式。
select
de.ID as ConsumerID
,dd.ID as DependentID,
f.ApplicationroductID,
LEAD(f.ApplicationroductID) OVER (Order by fep.ApplicationroductID) Lead,
LAG(f.ApplicationroductID) OVER (Order by fep.ApplicationroductID) Lag
from Fact f
INNER JOIN DimEmp de ON fep.DimEmp_FK = de.ID
INNER JOIN DimDep dd ON fep.DimDep_FK = dd.ID
答案 0 :(得分:0)
尝试这样的事情:
;with cte as
(
select
de.ID as ConsumerID,
null as DependentID,
de.ConsumerName,
null as ParticipantName,
f.ApplicationroductID
from Fact f
INNER JOIN DimEmp de ON f.DimEmp_FK = de.ID
union
select
de.ID as ConsumerID,
dd.ID as DependentID,
null as ConsumerName,
dd.ParticipantName,
f.ApplicationroductID
from Fact f
INNER JOIN DimEmp de ON f.DimEmp_FK = de.ID
INNER JOIN DimDep dd ON f.DimDep_FK = dd.ID
)
select case
when DependentID is null then ConsumerID
else null
end as ConsumerID,
DependentID,
ConsumerName,
ParticipantName,
ApplicationroductID
from cte
order by ConsumerId,
DependentId
两个SELECTS + UNION将为您提供所有行,每行类型为NULL或实际值。我们在SELECT中获取ConsumerId,以便在外部SELECT的ORDER BY表达式中使用它。外部SELECT切换NULL或ConsumerId,具体取决于行类型。