【问题标题】:SQL - Summing at every level by conditions in hierarchySQL - 按层次结构中的条件在每个级别求和
【发布时间】:2017-11-30 21:58:07
【问题描述】:

我有一个问题要解决,即从层次结构中的最低子级到提供的最高级别(由 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,发现这对我来说是一个特别困难的问题。

【问题讨论】:

  • 嗯,它可以只是 Select sum(volume) as total from tree_from_id(215548) 。否则请提供样本数据和所需结果。
  • 至于问题的添加案例部分 - 有没有办法将它放在递归转换中?如果在计算中未考虑案例,则总和(体积)将不正确。有没有办法查看该特定项目/ID 是否存在于不同的表中,然后查看添加是否存在?我想这会出现在演员阵容中。此外,这种递归从顶部获取卷并在向下时添加它们 - 有没有办法从孩子开始?谢谢塞尔格!
  • 是的,您可以从孩子开始,只需反向打开:ON i.id = tc.id_parent。是的,您可以将 tree_from_id(...) 与其他数据连接起来,它可以被视为 SELECT 中的常规表。
  • 刚刚尝试过,看看我是否可以解决层次结构。关于为递归添加条件的任何想法?
  • 递归中的条件意味着在适当的步骤中断递归,而不是跳过该步骤并继续。

标签: sql sql-server tsql


【解决方案1】:

我不确定你要累积的是不是数量,但你不能边走边总结吗?

部分sn-p....

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

【讨论】:

  • 这似乎是从下到上的——你知道一种允许从最底层的孩子向上求和的方法吗?谢谢!
  • 我不明白您如何从最低级别添加。例如,如果你的父节点有两个不同值的子节点,那么父节点会得到什么值?
  • 父级将获得值的总和,除非条件中另有说明。本质上,计算规则是,对于每个父级,父级的值是子级值的总和。这是计算的基础,而其他条件将解释一些例外情况。你知道不使用光标的方法吗?
  • 我看到了你的麻烦。这有点超出了我的能力,但也许您可以在stackoverflow.com/questions/16233946/… 此处根据您的情况调整答案以使用自下而上的方法。当然,您还需要保留子节点的总和并将该表也加入其中。可以肯定的是,这不是微不足道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多