用于格式化分层列表中的父子级的SQL查询

时间:2017-06-07 20:02:08

标签: sql sql-server

我想让数据显示在下面的父子类似关系中,其中第一行应该是父行,而后续每行应该是所有父特定列中为null的子行。 enter image description here

[![这是例子] [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

1 个答案:

答案 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,具体取决于行类型。