Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ID ParentID Points
- 1 0 230
- 2 1 150
- 3 0 80
- 4 1 110
- 5 4 54
- 6 4 342
- Tree:
- 0
- |---
- 1 3
- |
- 2 4---
- 5 6
- ID Points Level1 Level2
- 1 230 150+110 150+110+54+342
- 2 150
- 3 80
- 4 110 54+342
- 5 54
- 6 342
- SELECT rel.parent_id, SUM(tbl.points)
- FROM table tbl INNER JOIN relations rel ON tbl.id=rel.id
- WHERE rel.parent_id <> 0
- GROUP BY rel.parent_id;
- WITH Parent (id, GrandParentId, parentId, Points, Level1Points, Level2Points)
- AS
- (
- -- Find root
- SELECT id,
- 0 AS GrandParentId,
- ParentId,
- Points,
- 0 AS Level1Points,
- 0 AS Level2Points
- FROM tblPoints ptr
- WHERE ptr.ParentId = 0
- UNION ALL (
- -- Level2 Points
- SELECT pa.GrandParentId AS Id,
- NULL AS GrandParentId,
- NULL AS ParentId,
- 0 AS Points,
- 0 AS Level1Points,
- pa.Points AS Level2Points
- FROM tblPoints pt
- JOIN Parent pa ON pa.GrandParentId = pt.Id
- UNION ALL
- -- Level1 Points
- SELECT pt.ParentId AS Id,
- NULL AS GrandParentId,
- NULL AS ParentId,
- 0 AS Points,
- pt.Points AS Level1Points,
- 0 AS Level2Points
- FROM tblPoints pt
- JOIN Parent pa ON pa.Id = pt.ParentId AND pa.ParentId IS NOT NULL
- UNION ALL
- -- Points
- SELECT pt.id,
- pa.ParentId AS GrandParentId,
- pt.ParentId,
- pt.Points,
- 0 AS Level1Points,
- 0 AS Level2Points
- FROM tblPoints pt
- JOIN Parent pa ON pa.Id = pt.ParentId AND pa.ParentId IS NOT NULL )
- )
- SELECT id,
- SUM(Points) AS Points,
- SUM(Level1Points) AS Level1Points,
- CASE WHEN SUM(Level2Points) > 0 THEN SUM(Level1Points) + SUM(Level2Points) ELSE 0 END AS Level2Points
- FROM Parent
- GROUP BY id
- ORDER by id
- CREATE FUNCTION CALC
- (
- @node integer,
- )
- returns
- (
- @total integer
- )
- as
- begin
- select @total = (select node_value from yourtable where node_id = @node);
- declare @children table (value integer);
- insert into @children
- select calc(node_id) from yourtable where parent_id = @node;
- @current = @current + select sum(value) from @children;
- return
- end
- Id ParentId
- 1 NULL
- 11 1
- 12 1
- 110 11
- 111 11
- 112 11
- 120 12
- 121 12
- 122 12
- 123 12
- 124 12
- Id Val
- 110 500
- 111 50
- 112 5
- 120 3000
- 121 30000
- 122 300000
- ;WITH Data (Id, Val) AS
- (
- select t.Id, SUM(v.val) as Val from dbo.TestTable t
- join dbo.Amount v on t.Id = v.Id
- group by t.Id
- )
- select cd.Id, ISNULL(SUM(cd.Val), 0) as Amount FROM
- (
- -- level 3
- select t.Id, d.val from TestTable t
- left join Data d on d.id = t.Id
- UNION
- -- level 2
- select t.parentId as Id, sum(y.Val) from TestTable t
- left join Data y on y.id = t.Id
- where t.parentId is not null
- group by t.parentId
- UNION
- -- level 1
- select t.parentId as Id, sum(y.Val) from TestTable t
- join TestTable c on c.parentId = t.Id
- left join Data y on y.id = c.Id
- where t.parentId is not null
- group by t.parentId
- ) AS cd
- group by id
- Id Amount
- 1 333555
- 11 555
- 12 333000
- 110 500
- 111 50
- 112 5
- 120 3000
- 121 30000
- 122 300000
- 123 0
- 124 0
Add Comment
Please, Sign In to add comment