CTE in SQL Server 2008: how to calculate subtotals recursively

放肆的年华 提交于 2019-12-04 07:47:34

You can try something like this

DECLARE @Table TABLE(
        parentId INT,
        Id INT,
        description VARCHAR(50),
        qty FLOAT,
        manufacturingCost FLOAT,
        costDescripcion VARCHAR(50)
)

INSERT INTO @Table SELECT NULL,1,'Car',1,100,'Assembly the car' 
INSERT INTO @Table SELECT NULL,2,'Motorcycle',1,100,'Assembly the motrocycle' 
INSERT INTO @Table SELECT 1,11,'Wheel',4,20,'Assembly the wheel' 
INSERT INTO @Table SELECT 11,111,'Rim',1,50,'Manufacture the rim' 
INSERT INTO @Table SELECT 11,112,'Tire',1,60,'Manufacture the tire' 
INSERT INTO @Table SELECT 1,12,'Door+Window',4,30,'Assembly the door and the window' 
INSERT INTO @Table SELECT 12,121,'Door',1,30,'Manufacture the door' 
INSERT INTO @Table SELECT 12,122,'Window',2,10,'Manufacture the window' 
INSERT INTO @Table SELECT 2,11,'Wheel',2,15,'Assembly the wheel'

;WITH Vals AS (
        SELECT  *,
                qty Level_Qty,
                CAST(id AS VARCHAR(MAX)) + '\' AS [LEVEL]
        FROM    @Table
        WHERE   parentId IS NULL
        UNION ALL
        SELECT  t.*,                
                p.qty * t.qty Level_Qty,
                CAST(p.[LEVEL] AS VARCHAR(MAX))  + CAST(t.id AS VARCHAR(MAX)) + '\' AS [LEVEL]
        FROM    @Table t INNER JOIN
                Vals p  ON  p.Id = t.parentId
)
SELECT  *,
        (SELECT SUM(Level_Qty * manufacturingCost) FROM Vals WHERE [Level] LIKE v.[LEVEL] + '%') / Level_Qty
FROM    Vals v
ORDER BY [LEVEL]

SQL Fiddle Example

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!