2016-04-25 53 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)