使用级别列

时间:2016-04-25 16:22:48

标签: sql sql-server tsql primavera

我很抱歉提出一个可能已经回答的问题,但我真的很难理解如何正确地从我的数据库中获得我需要的东西。我有一个primavera P6数据库,我试图从中获取可用的WBS代码。但是,因为我将其构建到报告仪表板中,所以我需要做的不仅仅是连接父/子值。我的问题将分为两部分,但要理解我的问题,这里是数据库的基本模型。

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代码的其他数据源中。感谢您给予的任何和所有帮助。

1 个答案:

答案 0 :(得分: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)