Mr.DYD 2021-06-09 17:17 采纳率: 66.7%
浏览 33

Oracle 金额按顺序匹配

已知两张表 

t1

line_id1 amount1

1          100
2          50

t2

line_id1 amount2

1          120
2          10
3          20

两张表的按照sum(ti.amount1)=sum(t2.amount2),需按照金额进行组合,最终呈现的效果是t1的amount1可以由t2的哪几行拼接而成(无强制规定,只需合理分配即可)。

根据amount顺序排列得出如下数据

例如

line_id1 amount1 line_id2 amount2

1          100            1           100
2          50              1            20
2          50              2            10
2          50              3            20

oracle该如何处理呀?

按照金额进行组合,通过存储过程或函数或sql查询均可!

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-14 23:50
    关注

    这是一个比较复杂的问题,需要用到一些高级的SQL语句来实现。下面是一段可以实现该需求的SQL查询语句:

    WITH t2_agg AS (
        SELECT
            SUM(amount2) AS amount2,
            LISTAGG(line_id2, ',') WITHIN GROUP (ORDER BY amount2) AS line_ids
        FROM t2
        GROUP BY SUM(amount2)
    )
    SELECT
        t1.line_id1,
        t1.amount1,
        t2_agg.line_ids,
        t2_agg.amount2
    FROM t1
    JOIN t2_agg ON t2_agg.amount2 = t1.amount1
    

    这里使用了SQL中的WITH语句来创建一个临时的表t2_agg,该表中按照总金额对t2表进行聚合,并用LISTAGG函数将每个金额对应的line_id2连接成字符串。然后将t1表和t2_agg表进行JOIN操作,将t1中每个金额与t2中的所有金额进行匹配,并将匹配成功的结果按照金额顺序进行组合。最终输出的结果中,每个t1的amount1都会对应一个或多个t2中的金额,并且这些t2中的金额按照金额顺序进行了拼接。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料