gpt4 book ai didi

sql - SQL (Oracle) 中的递归计算

转载 作者:行者123 更新时间:2023-12-04 19:07:51 25 4
gpt4 key购买 nike

我很难找到将一些数据 ETL 到我的结果表中的解决方案。我认为我无法使用纯 SQL 完成此操作,并且由于循环而需要使用 PL-SQL。 sql 大师能否帮助我走向正确的方向或提供一些解决此问题的指针?

这是场景:
表:TABLEA和TABLEB。

脚步:

  • 按 A_CD 对 TABLEA 中的记录进行分组,并对 A_AMT FIELD 进行求和。 (让我们假设 A_FLAG 对于任何 A_CD 总是相同的。)。让我们将分组结果集称为 TABLEA_GRP(这不是表,而是分组查询)。
  • 从 TABLEB 中选取一行,如果 B_FLG 为“N”,则选取 TABLEA_GRP 中 A_FLG 为“N”的所有行。如果 B_FLG 为“Y”,则选择 TABLEA_GRP 中的所有行。
  • 从步骤 2 中选取的第一条记录开始,计算其 TOTAL_AMT 与所选行的所有 TOTAL_AMT 的总和的比率。将该比率与 B_AMT 相乘,并将结果数量添加到行 TOTAL_AMT 并存储在 RESULTING_AMT 中。对步骤 2 中选取的所有行重复此计算。
  • 重复第 2 步和第 3 步,现在使用来自先前计算相同 A_CD 的 RESULTING_AMT 值的起始 TOTAL_AMT VALUE。

  • RESULTING _RATIO 字段不需要保存,仅用于演示目的。你会怎么做?

    基本上我想从 TABLEA 和 TABLEB 获取 RESULTING_TABLE 中的数据

    有人可以帮忙吗?非常感谢您的任何指导。

    Table Design with sample data

    编辑:我添加了 A_DATE 和 B_DATE 以支持两个表之间的连接。为简单起见,您可以只执行 A.A_DATE = B.B_DATE,例如这个基本连接:
    SELECT
    A.A_CD,
    SUM(A.A_AMT) AS TOTAL_AMT,
    A.A_FLAG,
    A.A_DATE,
    B.B_ID,
    B.B_AMT,
    B.B_FLAG
    FROM
    TABLEA A
    JOIN TABLEB B
    ON A.A_DATE = B.B_DATE
    GROUP BY
    A.A_CD,
    A.A_FLAG,
    A.A_DATE,
    B.B_ID,
    B.B_AMT,
    B.B_FLAG
    ;

    Resulting data of above join

    最佳答案

    好的,我想我已经找到了解决方案。这些数字与你的有点不同,但我很确定我的正在做你想做的。我们可以使用单个查询 (main_sql) 完成步骤 1 和 2 中的所有操作。 3 和 4 必须使用递归语句 (recur_sql) 来完成。

    with main_sql as (
    select a.*,
    b.*,
    sum(a_amt) over (partition by b_id) as cd_amt,
    rank() over (partition by a_cd order by b_id) as rnk
    from (select a_cd, a_flag, sum(a_amt) as a_amt
    from tablea
    group by a_cd, a_flag) a,
    tableb b
    where a.a_flag = case when b.b_flag = 'Y' then a.a_flag else b.b_flag end
    order by b_id, a_cd
    ),
    recur_sql (a_cd, b_id, total_amt, cd_amt, resulting_ratio, resulting_amt, rnk) as (
    select m.a_cd,
    m.b_id,
    m.a_amt as total_amt,
    m.cd_amt, m.a_amt / m.cd_amt as resulting_ratio,
    m.a_amt + (m.a_amt / m.cd_amt * m.b_amt) as resulting_amt,
    rnk
    from main_sql m
    where rnk = 1

    union all

    select m.a_cd,
    m.b_id,
    r.resulting_amt as total_amt,
    m.cd_amt,
    r.resulting_amt / m.cd_amt as resulting_ratio,
    r.resulting_amt + (r.resulting_amt / m.cd_amt * m.b_amt) as resulting_amt,
    m.rnk
    from recur_sql r,
    main_sql m
    where m.rnk > 1
    and r.a_cd = m.a_cd
    and m.rnk - 1 = r.rnk

    )
    select a_cd, b_id, total_amt, resulting_ratio, resulting_amt
    from recur_sql
    order by 2, 1

    enter image description here

    关于sql - SQL (Oracle) 中的递归计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876737/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com