SQL - 按层次结构中的条件在每个级别求和

时间:2017-06-27 18:14:30

标签: sql sql-server tsql

我有一个问题,我试图解决从层次结构中最低的孩子到提供的最高级别(由ID标注)的总结。本质上,我试图将一个大容器的ID输入到一个递归函数中,该函数计算较低节点的值,然后将它们追溯到该特定ID。

我在递归CTE中处理层次结构,并且能够达到以下所示的点:

ALTER FUNCTION [dbo].[tree_from_id](@myid INT) RETURNS TABLE AS
RETURN (
    WITH tree_cte (id, ID_PARENT, VOLUME, nlevel, treepath)
as
(SELECT i.id, i.id_parent, i.VOLUME, nlevel = 1, cast(i.id as nvarchar(255)) as treepath
 FROM item i
 WHERE id = @myid

 UNION ALL

 SELECT i.ID, i.ID_PARENT, i.VOLUME, tc.nlevel + 1, cast(tc.treepath+' <- ' + cast(i.id as nvarchar(255))as nvarchar(255)) as treepath
 FROM tree_cte tc
 INNER JOIN
 item i ON i.id_parent = tc.id
 SELECT * FROM tree_cte
 )
GO

这使我能够获得每个项目的级别并显示它们的层次结构,通过调用函数来完成:

SELECT * FROM tree_from_id(215548)

其中215548是特定物品ID。

我正在寻找为项目量实现类似的东西,但我不确定如何从较低的孩子聚集到他们的父母。我尝试了与上面所示相同的方法,但可以理解的是,它从父母开始并向下添加到孩子们身上。

此外,还有一种方法可以添加定义是否添加该项目的音量/为其音量使用不同值的案例吗?例如 - 如果项目没有子项,请为卷使用不同的维度?

谢谢!我想了解更多关于SQL的信息,发现这对我来说是一个特别棘手的问题。

1 个答案:

答案 0 :(得分:0)

我不确定你想要累积的音量,但是你不能在你去的时候总结它吗?

部分摘要....

UNION ALL

SELECT i.ID, i.ID_PARENT, i.VOLUME+tc.VOLUME, tc.nlevel + 1, cast(tc.treepath+' <- ' + cast(i.id as nvarchar(255))as nvarchar(255)) as treepath
FROM tree_cte tc