Oracle SQL / PLSQL:分层递归查询

问题描述 投票:0回答:1

我之前问过非常相似的问题,但仍未达到正确的结果……魅力的三倍,但我现在有一个稳定的亲子关系可以使用。

多级数据集中的每一行都有成本。对于特定的行,我需要找到最低级别并汇总成本。然后,我的用户将汇总的成本与行成本进行比较,并在发现差异时进行故障排除。

SQL Fiddle here

数据样本:

MODEL_NO    MODEL_REV   P_SEQ_NO    SEQ_NO  UNIT_COST   QTY LEVEL   TREE_PATH   ISLEAF
1000    1   100 300 8889    1   1   >300    0
1000    1   300 400 1701    1   2   >300>400    1
1000    1   300 500 970 1   2   >300>500    1
1000    1   300 600 7   2   2   >300>600    1
1000    1   300 700 1160    1   2   >300>700    1
1000    1   300 800 580 1   2   >300>800    1
1000    1   300 900 96  1   2   >300>900    1
1000    1   300 1000    350 1   2   >300>1000   1
1000    1   300 1100    59  4   2   >300>1100   0
1000    1   1100    1200    28  1   3   >300>1100>1200  1
1000    1   1100    1300    1   1   3   >300>1100>1300  1
1000    1   1100    1400    3   1   3   >300>1100>1400  1
1000    1   1100    1500    4   1   3   >300>1100>1500  1
1000    1   1100    1600    22  1   3   >300>1100>1600  1

我正在根据数据集中的特定行(MODEL_NOMODEL_REVP_SEQ_NOSEQ_NO创建唯一键)来寻找函数或SQL语句,这将返回费用汇总。

例如:根据以下记录:1000, 1, 300, 1100,我希望得到以下结果:232

这是通过将每个最低级别子项的UNIT_COST乘以它的QTY,然后将每个子项的总和相加,然后将结果乘以父级的QTY来计算的,重复最后一步直到输入的每个记录,在这种情况下为SEQ_NO = 1100

结果工作方式:(22*1 + 4*1 + 3*1 + 1*1 + 28*1) *4

此示例只有1级深度,我的数据可以达到6/7级深度。

sql oracle hierarchical-data connect-by
1个回答
0
投票

您具有路径,因此不需要递归CTE或分层查询。

我认为您想要:

select sum(t.qty * (tx.qty * tx.price))
from prod_cost_model_struct_tab t join
     (select t.*
      from prod_cost_model_struct_tab t
      where MODEL_NO = 1000 and MODEL_REV = 1 and P_SEQ_NO = 1100 and SEQ_NO = 3
     ) tx
     on tx.path like t.path || '>%';
© www.soinside.com 2019 - 2024. All rights reserved.