簡體   English   中英

如何將孩子的累計總和與其父母相提並論?

[英]How to get the cumulative sum of children up its parents?

因此,我編寫了一個查詢來獲取子項的累積總和,但我認為分區總和對於不屬於子項的父項的總計存在錯誤。

我的小提琴是http://sqlfiddle.com/#!15/88828/1我沒有運行總數,但那是錯誤的。 我希望兄弟姐妹總數為一個孩子,而孩子總數返回其父級。所以基本上累積了一個孩子的總數。

預計 output

    parent_child_tree   id  name    dimensionvalueid    level   order_sequence  volume  cummulative_total
  A1                     1  A1        (null)              0       1              20     840
-----A1:1                2  A1:1       1                  1       1_1           (null)  820
----------A1:1:1         3  A1:1:1     2                  2       1_1_2          20     820
-----------A1:1:1:1      4  A1:1:1:1   3                  3       1_1_2_3        300    800
-----------A1:1:1:2      5  A1:1:1:2.  3                  3       1_1_2_3        500    500
B1                       6  B1        (null)              0       6              200    300
-----B1:2                8  B1:2       6                  1       6_6           (null)  null
-----B1:1                7  B1:1       6                  1       6_6           (null)  100
----------B1:2:1         9  B1:2:1     8                  2       6_6_8         100     100

在此處輸入圖像描述

要獲取樹節點的總數,您需要為子查詢中的每個節點生成層次結構樹,如下所示

SELECT
    d.*,
    v.volume,
    (
        WITH RECURSIVE cte AS (
                SELECT 
                    dd.id AS branch_id,
                    dd.id
                FROM dimensionvalue dd
                WHERE dd.id = d.id
                UNION ALL
                SELECT
                    cte.branch_id,
                    dd.id
                FROM dimensionvalue dd
                JOIN cte ON dd.dimensionvalueid = cte.id
        )
        SELECT SUM(v.volume)
        FROM cte
        JOIN valuation v ON v.dimensionvalueid = cte.id
        GROUP BY cte.branch_id
    ) AS totals
FROM dimensionvalue d
LEFT JOIN valuation v ON v.dimensionvalueid = d.id
ORDER BY d.name;

如果您確實需要在查詢中為每個樹節點生成的所有那些“裝飾”列,那么您可以將遞歸 CTE hierarchy與子查詢結合起來進行這樣的總計計算

WITH RECURSIVE hierarchy AS (
    SELECT
    d.id,
    d.name,
    d.dimensionvalueid,
    0 AS level,
        CAST(d.id AS varchar(50)) AS order_sequence
    FROM dimensionvalue d
    WHERE d.dimensionvalueid IS NULL
    UNION ALL
    SELECT
    e.id,
    e.name,
    e.dimensionvalueid,
    hierarchy.level + 1 AS level,
    CAST(hierarchy.order_sequence || '_' || CAST(hierarchy.id AS VARCHAR(50)) AS VARCHAR(50)) AS order_sequence
    FROM hierarchy
    JOIN dimensionvalue e ON e.dimensionvalueid = hierarchy.id
)
SELECT
    RIGHT('-----------', h.level * 5) || h.name || ' ' AS parent_child_tree, 
    h.*,
    v.volume,
    (
        WITH RECURSIVE cte AS (
                SELECT 
                    dd.id AS branch_id,
                    dd.id
                FROM dimensionvalue dd
                WHERE dd.id = h.id
                UNION ALL
                SELECT
                    cte.branch_id,
                    dd.id
                FROM dimensionvalue dd
                JOIN cte ON dd.dimensionvalueid = cte.id
        )
        SELECT SUM(v.volume)
        FROM cte
        JOIN valuation v ON v.dimensionvalueid = cte.id
        GROUP BY cte.branch_id
    ) AS totals
FROM hierarchy h
LEFT JOIN valuation v ON v.dimensionvalueid = h.id
ORDER BY h.name

您可以在此處查看工作演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM