2016-04-25 4 views
0

Ich entschuldige mich für das Stellen einer Frage, die wahrscheinlich schon beantwortet wurde, aber ich habe wirklich Mühe zu verstehen, wie ich das, was ich brauche, aus meiner Datenbank bekomme. Ich habe eine Primavera P6 Datenbank, von der ich versuche, brauchbare WBS Codes zu bekommen. Da ich dies jedoch in einem Berichtsdashboard aufbaue, muss ich mehr tun, als nur Eltern-/Kindwerte zu verketten. Meine Frage wird in zwei Teilen bestehen, aber um meine Frage zu verstehen, ist das Grundmodell der Datenbank.T-SQL rekursives übergeordnetes Kind mit geebneten Spalten auswählen

wbs_id wbs_short_name parent_wbs_id 
1   CONTR    null 
2   RET    null 
3   PRC    1 
4   FEE    1 
5   PRC    2 
6   FEE    2 
7   100    3 
8   110    4 
9   200    5 
10  210    6 

Meine erste Frage ist, wie kann ich eine Abfrage schreiben, die mir jede andere „Ebene“ geben werden von wbs_short_name in separaten Spalten nivelliert? Das Endergebnis sollte wie folgt aussehen:

Level_1 Level_2  Level_3 Level_4 
CONTR  PRC   100  null 
CONTR  FEE   110  null 
RET  PRC   200  null 
RET  FEE   210  null 

Ich habe eine LEVEL_4 weil in der aktuellen Datenbank hinzugefügt die Pegel auf etwa 7 Stufen nach unten erstrecken in, aber das würde in diesem Beispiel verkomplizieren. Meine zweite Frage ist (ich erwarte) viel einfacher, ist es dann möglich, eine zusätzliche Endspalte hinzuzufügen, die all diese Ebenen zu einem einzigen PSP-Code verkettet und kombiniert? Das würde wie folgt aussehen:

Level_1 Level_2  Level_3 WBS 
CONTR  PRC   100  CONTRPRC100 
CONTR  FEE   110  CONTRPRC110 
RET  PRC   200  RETPRC200 
RET  FEE   210  RETPRC210 

ich die Ebene Spalten für Slicer Kontrollen auf meinem Armaturenbrett benötigen und ich brauche die PSP in der Lage sein eine Verknüpfungstabelle zu konstruieren, die mir erlauben, zu meiner P6 Datenbank zu meinen anderen Datenquellen zu verbinden die diese PSP-Codes verwenden. Danke für jede Hilfe.

+0

Sie haben zwei verschiedene Techniken gehen auf diese Arbeit zu machen. Erstens ist eine rekursive cte, um die Daten zu erhalten. Dann müssen Sie FOR XML verwenden, um Werte aus den Zeilen zu verketten. Wir können Ihnen helfen, benötigen aber zuerst einige Informationen von Ihnen. Hier ist ein großartiger Ort. anfangen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

Antwort

0

Habe ich es am Ende aus, hier ist, wie ich es tat:

SELECT l1.wbs_short_name l1_wbs_short_name, 
    l2.wbs_short_name l2_wbs_short_name, 
    l3.wbs_short_name l3_wbs_short_name, 
    l4.wbs_short_name l4_wbs_short_name, 
    l5.wbs_short_name l5_wbs_short_name, 
    l6.wbs_short_name l6_wbs_short_name, 
    CONCAT(l1.wbs_short_name, l2.wbs_short_name, l3.wbs_short_name) as WBS, 
    l3.wbs_id 
FROM PROJWBS l1 
    LEFT JOIN PROJWBS l2 ON l2.parent_wbs_id = l1.wbs_id 
    LEFT JOIN PROJWBS l3 ON l3.parent_wbs_id = l2.wbs_id 
    LEFT JOIN PROJWBS l4 ON l4.parent_wbs_id = l3.wbs_id 
    LEFT JOIN PROJWBS l5 ON l5.parent_wbs_id = l4.wbs_id 
    LEFT JOIN PROJWBS l6 ON l6.parent_wbs_id = l5.wbs_id 
WHERE l1.parent_wbs_id = 1 
    AND l3.wbs_id IS NOT NULL 
ORDER BY CONCAT(l1.wbs_short_name, l2.wbs_short_name, l3.wbs_short_name)