2017-06-07 60 views
0

我想讓數據顯示在下面的父級子級關係中,其中第一行應該是父行,並且每個後續行都應該是子級全部爲空的子級父母特定的列。 enter image description hereSQL查詢來格式化父級孩子在分級列表中

[![這裏是示例] [2] [2]

在消費者99999999有2名家屬22222222和33333333.

我試着用鉛做這和滯後以上,但這將需要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

您正在使用哪種RDBMS? mysql,oracle和sql server都是不同的產品。另外,CTE不是臨時表。 – JNevill

+0

@JNveill編輯了更多細節。它的Sql服務器。 –

回答

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 +聯盟將讓你所有的行,用NULL或實際價值爲每一行類型。我們在兩個SELECT中都獲得了ConsumerId,以便在外部SELECT的ORDER BY表達式中使用它。外部SELECT根據行類型切換NULL或ConsumerId。

+0

感謝您的解決方案的工作,但想象一下,如果有更多的依賴屬性,我們想要像DependetFirstName,LastName等消費者隱藏。它將需要大量的case語句。這不會很有效率。在我的實際解決方案中,我現在有15個case語句,查詢速度很慢,只有3個連接。 –

+0

關於維護的好處,但性能並不是這些簡單CASE的問題。 – IngoB