2017-06-07 1 views
0

Ich möchte, dass die Daten in der folgenden übergeordneten untergeordneten Beziehung angezeigt werden, wobei die erste Zeile die übergeordnete Zeile und jede nachfolgende Zeile für das untergeordnete Element mit null sein sollte Eltern spezifische Spalten. enter image description hereSQL-Abfrage zum Formatieren des übergeordneten untergeordneten Elements in einer hierarchischen Liste

[! [Hier ist das Beispiel] [2]] [2]

In dem über dem Verbraucher 99999999 hat 2 unterhalt 22222222 und 33333333.

Ich habe versucht, dies mit Blei zu tun und hinke aber das wird eine Bestellung im CTE benötigen. Ich dachte daran, die vorherige ApplicationroductID zu sehen, und würde kennzeichnen, wenn ich sehe, dass es sich geändert hat. Indem ich das mache, kann ich die Eltern und das Kind markieren. Ich könnte möglicherweise mit der Bestellung nach Problem durch die Verwendung einer temporären Tabelle, aber das klingt nicht wie eine sehr gute Lösung. Gibt es einen besseren Weg, der Ihnen einfällt? Ich möchte, dass die Daten das oben genannte Format haben.

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

Welche RDBMS verwenden Sie? mysql, oracle und sql server sind verschiedene Produkte. Ein CTE ist auch keine temporäre Tabelle. – JNevill

+0

@JNveill Edited mit mehr Details. Sein Sql-Server. –

Antwort

0

so etwas wie dieses Versuchen:

;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 

Die beiden SELECTS + UNION finden Sie alle Zeilen erhalten, mit NULL oder einen echten Mehrwert für jede Zeile Typ. Wir rufen die ConsumerId in beiden SELECTs auf, um sie im ORDER BY-Ausdruck des äußeren SELECT zu verwenden. Je nach Zeilentyp wechselt das äußere SELECT NULL oder ConsumerId.

+0

Vielen Dank, dass Ihre Lösung funktioniert, aber stellen Sie sich vor, wenn es weitere abhängige Attribute gibt, die wir für Kunden wie DependedFirstName, LastName usw. verbergen möchten. Es wird eine Menge von Case-Anweisungen erfordern. Dies wird nicht sehr effizient sein. In meiner tatsächlichen Lösung habe ich jetzt 15 Case-Anweisungen und Abfrage ist sehr langsam mit nur 3 Joins. –

+0

Guter Punkt in Bezug auf Wartung, aber Leistung ist kein Problem mit diesen einfachen CASEs. – IngoB

Verwandte Themen