关于CTE描述的透视

时间:2018-05-03 18:52:27

标签: sql-server

如果有人能指出我正确的方向,我将不胜感激。

这是对多个表进行CTE查询的结果。我需要重新定义输出,我只能想到使用一个支点来做它。

    Id | Parent_Id | Description | Account_Number | Year_of_Entry | Amount
    -----------------------------------------------------------------------
    1  | NULL      | V           | 001            | 2017          | 4
    2  |  1        | W           | 002            | 2017          | 2
    3  |  2        | X           | 003            | 2017          | 1
    4  |  2        | Y           | 004            | 2017          | 1
    5  |  1        | Z           | 005            | 2017          | 2
    6  |  5        | T           | 006            | 2017          | 2
    7  |  6        | X           | 007            | 2017          | 1
    8  |  6        | Y           | 008            | 2017          | 1
    1  | NULL      | V           | 001            | 2016          | 8
    2  |  1        | W           | 002            | 2016          | 4
    3  |  2        | X           | 003            | 2016          | 2
    4  |  2        | Y           | 004            | 2016          | 2
    5  |  1        | Z           | 005            | 2016          | 4
    6  |  5        | X           | 006            | 2016          | 2
    7  |  5        | Y           | 007            | 2016          | 2

我想获得与此匹配的输出。

    Id | Parent_Id | Description | Account_Number | Year_of_entry| Amount|  X |  Y  
    ---------------------------------------------------------------------------------
    1  | NULL      | V           | 001            | 2017         | 4     | 2  |  2  
    2  |  1        | W           | 002            | 2017         | 2     | 1  |  1
    5  |  1        | Z           | 005            | 2017         | 2     | 1  |  1
    6  |  5        | T           | 006            | 2017         | 2     | 1  |  1
    1  | NULL      | V           | 001            | 2016         | 8     | 4  |  4  
    2  |  1        | W           | 002            | 2016         | 4     | 2  |  2
    5  |  1        | Z           | 005            | 2016         | 4     | 2  |  2

使用CTE递归查询的当前输出

    Id | Parent_Id | Description | Account_Number | Year_of_entry| Amount|  X |  Y  
    ---------------------------------------------------------------------------------
    1  | NULL      | V           | 001            | 2017         | 4     | 0  |  0  
    2  |  1        | W           | 002            | 2017         | 2     | 1  |  1
    5  |  1        | Z           | 005            | 2017         | 2     | 0  |  0
    6  |  5        | T           | 006            | 2017         | 2     | 1  |  1
    1  | NULL      | V           | 001            | 2016         | 8     | 0  |  0  
    2  |  1        | W           | 002            | 2016         | 4     | 2  |  2
    5  |  1        | Z           | 005            | 2016         | 4     | 2  |  2

@Daniel代码的当前输出

    Id | Parent_Id | Description | Account_Number | Year_of_entry| Amount|  X |  Y  
    ---------------------------------------------------------------------------------
    2  |  1        | W           | 002            | 2017         | 2     | 1  |  1
    6  |  5        | T           | 006            | 2017         | 2     | 1  |  1
    2  |  1        | W           | 002            | 2016         | 4     | 2  |  2
    5  |  1        | Z           | 005            | 2016         | 4     | 2  |  2

我使用isnull转换为0

编辑:感谢您的帮助。 我最终使用2个递归CTE来解决这个问题。 第一个将X和Y值提供给Parent。 第二个将树上的所有总数传递给根。

再次感谢您的帮助。 问候 MJK

1 个答案:

答案 0 :(得分:0)

使用带聚合的条件逻辑来创建x和y列:

select a.Id,  a.Parent_Id, a.Description, a.Account_Number,  a.Year_of_Entry, a.Amount, 
    max(case when b.description in ('x','y') 
    then null else b.amount end) amount, sum(case when b.description='x' then b.amount else null end) X, 
sum(case when b.description='y' then b.amount else null end) y  from yourtable a 
      join yourtable b on (a.id=b.parent_id or a.parent_id is null) and a.Year_of_Entry=b.Year_of_Entry
    where b. description in ('x','y')
    group by a.Id, a.Parent_Id, a.Description, a.Account_Number,  a.Year_of_Entry, a.Amount
    order by a.Year_of_Entry desc, a.parent_id