The following statement
- uses
CTE to retrieve a list from each ItemTypeID with its root ItemTypeID - connects to
ItemType to get TypeName - connects to
Items to get ItemCost - groups on
TypeName to get the amount of ItemCost
SQL statement
;WITH q AS ( SELECT ItemTypeID , Root = ItemTypeID FROM ItemType WHERE ItemParent = 0 UNION ALL SELECT t.ItemTypeID, q.Root FROM q INNER JOIN ItemType t ON t.ItemParent = q.ItemTypeID ) SELECT it.TypeName, SUM(i.ItemCost) FROM q INNER JOIN ItemType it ON it.ItemTypeID = q.Root INNER JOIN Items i ON i.ItemTypeID = q.ItemTypeID GROUP BY it.TypeName
Test script
;WITH ItemType (ItemTypeID, ItemParent, TypeName) AS ( SELECT 1, 0, 'XXX' UNION ALL SELECT 2, 1, 'yyy' UNION ALL SELECT 3, 1, 'ZZZ' UNION ALL SELECT 4, 0, 'SSS' UNION ALL SELECT 5, 4, 'GGG' ) , Items (ItemID, ItemTypeID, ItemCost) AS ( SELECT 1, 1, 5000 UNION ALL SELECT 2, 2, 1000 UNION ALL SELECT 3, 4, 250 UNION ALL SELECT 4, 3, 2000 UNION ALL SELECT 5, 5, 400 ) , q AS ( SELECT ItemTypeID , Root = ItemTypeID FROM ItemType WHERE ItemParent = 0 UNION ALL SELECT t.ItemTypeID, q.Root FROM q INNER JOIN ItemType t ON t.ItemParent = q.ItemTypeID ) SELECT it.TypeName, SUM(i.ItemCost) FROM q INNER JOIN ItemType it ON it.ItemTypeID = q.Root INNER JOIN Items i ON i.ItemTypeID = q.ItemTypeID GROUP BY it.TypeName
source share