sql - 对层次结构的总值求和
问题描述
我有一张表格,显示了我们制造的零件的生产数量。生产过程允许我们在中游“拆分”生产。我正在寻找一种方法来简化从所有相关生产记录中获取总量的过程。
相关表格:
ID Parent ID Qty Batch
---------------------------------
1 Null 100 1
2 1 50 1-A
3 1 50 1-B
4 2 50 1-AA
5 Null 40 2
我想要的查询结果将获取顶级父级的所有子级的总相关数量,并总结
ID Related Qty TopLevelBatch
-----------------------------------
1 250 1
2 250 1
3 250 1
4 250 1
5 40 2
本质上,我正在寻找两件事
- 获取每个 ID 的顶级 ID,以及
- 获取顶级 ID 的所有子级。
解决方案
… 递归公用表表达式 …</p>
create table [relevant table] (id int,parentid int, qty int, batch varchar(10));
insert into [relevant table]
values
(1, Null, 100, '1'),
(2, 1, 50, '1-A'),
(3, 1, 50, '1-B'),
(4, 2, 50, '1-AA'),
(5, Null, 40, '2');
with cte
as
(
select *, id as topmostparentId, dense_rank() over(order by id) as topparentordinal
from [relevant table]
where parentid is null
union all
select r.*, c.topmostparentId, c.topparentordinal
from [relevant table] as r
join cte as c on r.parentid = c.id
)
select *,
sum(qty) over(partition by topmostparentId) as relatedqty
-- dense_rank() over(order by topmostparentId) as topparentordinal
from cte
--option(maxrecursion 0)
推荐阅读
- java - 未找到带参数的 Sprint 引导映射
- docker - docker 无法将本地文件添加到容器
- database - 如何在 VB.NET 中使用 1 个基本条件和 2 个特定条件计算 DataTable / DataBase 中的行数
- csv - 在 Athena 中创建外部表时出现数据错误
- marklogic - 更新了 MarkLogic 中的 umask 值,但未更改导出权限
- scala - 等待 Scala 中的“进程”完成
- angular - Angular 8:navigator.share() 说属性“share()”不存在
- wolfram-mathematica - 使mathematica 工作区变量在函数内部可访问,而无需使用函数参数
- excel - 找到符合条件的第 n 个最频繁值的有效方法
- ios - iOS Swift - WKWebview 如何基于 target='_top' 打开网页视图