首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SSRS:递归父子

SSRS:递归父子
EN

Stack Overflow用户
提问于 2016-01-20 00:36:14
回答 2查看 960关注 0票数 1

我想使用这个简单的表在SSRS中创建分层报告吗?你能帮帮我吗?我遵循这里的教程:https://www.mssqltips.com/sqlservertip/1939/working-with-a-parent-child-hierarchy-in-sql-server-reporting-services-ssrs/

但是我不知道EmployeeKey和ParentEmployeeKey是如何应用到我的桌子上的。就我的表而言,Col2是雇员,Col1是父级。但是在SSRS中,当我按Col2分组时,递归父级是COL1,我没有得到想要的结果。

这是我的桌子:

代码语言:javascript
运行
复制
╔══════════════╦══════════════╗
║     COL1     ║     COL2     ║
╠══════════════╬══════════════╣
║ TEST01       ║ TEST02       ║
║ TEST01       ║ TEST03       ║
║ TEST01       ║ TEST04       ║
║ TEST02       ║ LAB          ║
║ TEST02       ║ STL40        ║
║ TEST03       ║ LABSTL       ║
║ TEST03       ║ STLSCH40     ║
║ TEST04       ║ LABSTL       ║
║ TEST04       ║ FLG41        ║
║ TEST04       ║ STLSCH40     ║
╚══════════════╩══════════════╝

这就是我想要使用SSRS的结果。就像图片的缩进风格..。

代码语言:javascript
运行
复制
╔═══════════════╦══╗
║     COL1      ║  ║
╠═══════════════╬══╣
║ TEST01        ║  ║
║ -TEST02       ║  ║
║ ----LAB       ║  ║
║ ----STL40     ║  ║
║ -TEST03       ║  ║
║ ----LABSTL    ║  ║
║ ----STLSCH40  ║  ║
║ -TEST04       ║  ║
║ ----LABSTL    ║  ║
║ ----FLG41     ║  ║
║ ----STLSCH40  ║  ║
╚═══════════════╩══╝

我不知道上面的缩进式效果如何。我需要使用HierarchyID和IsDescendantOf还是递归CTE。这是我所做的递归CTE及其下的结果。

代码语言:javascript
运行
复制
Declare @Col1 varchar(30)='TEST01';
Declare @BomLevel Integer=0;
WITH tBOM
AS
(
select a.Col1 , a.Col2, @BomLevel "BOMLevel" from Component A
WHERE Col1= @Col1 
UNION ALL
Select c.Col1, c.Col2, BomLevel+1 From Component C
INNER JOIN tBOM on tBOM.Col2=c.Col1 
)
select Col1,Col2 ,BOMLevel from tbom 


Col1                             Col2                           BOMLevel
TEST01                      TEST02                          0
TEST01                      TEST03                          0
TEST01                      TEST04                          0
TEST02                      STL40                           1
TEST02                      LAB                             1
TEST03                      STLSCH40                        1
TEST03                      LABSTL                          1
TEST04                      STLSCH40                        1
TEST04                      FLG41                           1
TEST04                      LABSTL                          1
EN

Stack Overflow用户

回答已采纳

发布于 2016-01-20 04:10:04

这应该适用于任何深度(假设您没有通过SORT_PATH的VARCHAR(50) )。在执行层次结构时,您可以构建一个可以根据其进行排序的字符串(SORT_PATH)。最后,我们可以将REPLICATE()与BOMLevel一起用于缩进某物(在本例中为连字符)。

代码语言:javascript
运行
复制
SET NOCOUNT ON;

DECLARE @Component AS TABLE (
         COL1 VARCHAR(50) ,
         COL2 VARCHAR(50)
        );

INSERT  INTO @Component
        ( COL1, COL2 )
VALUES  ( NULL,     'TEST01' ),  -- ADDED
        ( 'TEST01', 'TEST02' ),
        ( 'TEST01', 'TEST03' ),
        ( 'TEST01', 'TEST04' ),
        ( 'TEST02', 'LAB'    ),
        ( 'TEST02', 'STL40'  ),
        ( 'TEST03', 'LABSTL' ),
        ( 'TEST03', 'STLSCH40' ),
        ( 'TEST04', 'LABSTL' ),
        ( 'TEST04', 'FLG41'  ),
        ( 'TEST04', 'STLSCH40' )

;
WITH    tBOM
          AS ( SELECT   A.COL1 , -- PARENT
                        A.COL2 , -- CURRENT
                        0 AS "BOMLevel",
                        CAST(A.COL2 AS VARCHAR(50)) AS SORT_PATH
               FROM     @Component A
               WHERE    A.COL1 IS NULL
               UNION ALL
               SELECT   C.COL1 ,
                        C.COL2 ,
                        BOMLevel + 1,
                        CAST(SORT_PATH + '.' + C.COL2 AS VARCHAR(50)) AS SORT_PATH
               FROM     @Component C
                        INNER JOIN tBOM ON tBOM.COL2 = C.COL1
             )
     SELECT COL1 ,
            COL2 ,
            BOMLevel,
            SORT_PATH,
            REPLICATE('-', tBOM.BOMLevel) + COL2 AS DISPLAY_PATH
     FROM   tBOM
     ORDER BY SORT_PATH
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34889523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档