如果有人能指出我正确的方向,我将不胜感激。
这是对多个表进行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
答案 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