gpt4 book ai didi

sql-server-2008 - SQL Server 2008中的CTE : how to calculate subtotals recursively

转载 作者:行者123 更新时间:2023-12-04 18:11:39 24 4
gpt4 key购买 nike

我有一张 table ,其中汽车的某些部件是分层关联的,并且我还需要在每一行中制造这些部件的成本。这是表格的简化:

parentId  Id description qty manufacturingCost costDescripcion
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 100 Assembly the car
NULL 2 Motorcycle 1 100 Assembly the motrocycle
1 11 Wheel 4 20 Assembly the wheel
11 111 Rim 1 50 Manufacture the rim
11 112 Tire 1 60 Manufacture the tire
1 12 Door+Window 4 30 Assembly the door and the window
12 121 Door 1 30 Manufacture the door
12 122 Window 2 10 Manufacture the window
2 11 Wheel 2 15 Assembly the wheel

我需要从“汽车”开始获取整个家谱,并显示每个分支的总数量和总成本。更好地解释:一辆汽车有4个轮子,每个轮子有1个轮辋和1个轮胎,所以我应该得到1个汽车,4个轮子,4个轮胎,4个轮辋。成本稍微复杂一点:组装汽车的成本为100美元,但我必须增加这一成本,其中包括组装4个车轮(4x20)和制造4个轮圈(4x50)和4个轮胎的成本(4x60),和门窗一样。

这是预期的结果:
parentId  Id description qty manufacturingCost   recLevel
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 940 (100+4*130+4*80) 0
1 11 Wheel 4 130 (20+50+60) 1
1 12 Door+Window 4 80 (30+30+2*10) 1
12 121 Door 4 30 2
12 122 Window 8 10 2
11 111 Rim 4 50 2
11 112 Tire 4 60 2

我可以使用递归函数或存储过程轻松实现这一目标,但是在使用更复杂的结构时它非常慢,因此我尝试使用通用表表达式来实现这一目标。但是我没有找到合计费用的方法。我使用递归CTE,从最高层开始,一直到下降,我得到了数量的总和,但是我应该从结构的内部到外部进行总和,我该怎么做?

这是创建表的代码:
CREATE TABLE #Costs 
(
parentId int,
Id int,
description varchar(50),
qty int,
manufacturingCost int,
costDescripcion varchar(150)
)

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

这是我写的CTE:
with CTE(parentId, id, description, totalQty, manufacturingCost, recLevel)
as
(
select c.parentId, c.id, c.description, c.qty, c.manufacturingCost, 0
from #Costs c
where c.id = 1

union all

select c.parentId, c.id, c.description, c.qty * ct.totalQty, c.manufacturingCost, ct.recLevel + 1
from #Costs c
inner join CTE ct on ct.id = c.parentId
)
select * from CTE

如您所见,这就是我得到的结果,它不是预期的结果(未添加成本):
parentId  Id description qty manufacturingCost recLevel
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 100 0
1 11 Wheel 4 20 1
1 12 Door+Window 4 30 1
12 121 Door 4 30 2
12 122 Window 8 10 2
11 111 Rim 4 50 2
11 112 Tire 4 60 2

可以使用CTE做我想做的事情吗?如果是这样,我该怎么办?

非常感谢你,

安端

最佳答案

您可以尝试这样的事情

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

关于sql-server-2008 - SQL Server 2008中的CTE : how to calculate subtotals recursively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com