2016-04-25 51 views
0

我很抱歉問一個問題可能已經被回答,但我真的很努力去理解如何正確地得到我需要的數據庫。我有一個primavera P6數據庫,我試圖從中獲取可用的WBS代碼。但是,因爲我將它構建到報告儀表板中,我需要做的不僅僅是連接父/子值。我的問題將分爲兩部分,但在此理解我的問題是數據庫的基本模型。T-SQL遞歸父子選擇與平整列

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 

我的第一個問題是,我怎麼可以編寫一個查詢,這將給我wbs_short_name的每個不同「級別」,在單獨的平整列?最終的結果應該是這樣的:

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

我添加了一個level_4因爲在實際的數據庫中的水平向下延伸到約7個級別,但這樣會過於複雜這個例子。我的第二個問題是(我預計)要簡單得多,是否可以添加一個額外的結尾列,將所有這些級別連接並組合到一個WBS代碼中?這將是這樣的:

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

我需要爲限幅器控制在我的儀表板水平列,我需要的WBS才能夠建立一個鏈接表,這將讓我加入我的P6數據庫到我的其他數據源它們使用這些WBS代碼。感謝您提供的所有幫助。

+0

你有兩種不同的技術怎麼回事,使這項工作。首先是獲取數據的遞歸cte。然後,您需要使用FOR XML來連接來自行的值。我們可以幫助但首先需要您提供一些信息。這裏是一個很棒的地方。開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

回答

0

我想通了,最終,這裏是我是如何做的:

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)