weixin_52389391 2022-04-07 22:49 采纳率: 42.9%
浏览 140
已结题

sql中跑出账户1到账户6的所有路径

img


实体 A 标志 交易金额 实体 B
账户 1 出 2 账户 11
账户 1 出 1 账户 12
账户 1 出 2 账户 12
账户 1 出 3 账户 12
账户 1 出 1 账户 2
账户 1 进 2 账户 2
账户 10 出 8 账户 6
账户 10 进 5 账户 11
账户 12 进 22 账户 10
账户 3 进 2 账户 2
账户 3 出 5 账户 7
账户 3 出 7 账户 7
账户 3 出 5 账户 7
账户 3 出 4 账户 9
账户 6 进 7 账户 4
账户 6 进 8 账户 10
账户 6 出 5 账户 10
账户 6 出 7 账户 11
账户 6 进 5 账户 7
账户 8 出 6 账户 4
账户 9 出 3 账户 8

如何在sql中跑出账户1到账户6的所有路径账户及每个路径中账户之间的单向汇总转账金额,如图上,转回的路径要剔除。

  • 写回答

3条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-04-08 01:41
    关注

    你题目里写错一行数据,坑了我一把。。。

    账户 12 进 22 账户 10

    应该为

    账户 12 出 22 账户 10

    with t as (
    SELECT '账户 1' 实体A,'出' 标志,2 交易金额,'账户 11' 实体B UNION ALL
    SELECT '账户 1', '出',1,'账户 12' UNION ALL
    SELECT '账户 1', '出',2,'账户 12' UNION ALL
    SELECT '账户 1', '出',3,'账户 12' UNION ALL
    SELECT '账户 1', '出',1,'账户 2' UNION ALL
    SELECT '账户 1', '进',2,'账户 2' UNION ALL
    SELECT '账户 10', '出',8,'账户 6' UNION ALL
    SELECT '账户 10', '进',5,'账户 11' UNION ALL
    SELECT '账户 12', '出',22,'账户 10' UNION ALL
    SELECT '账户 3', '进',2,'账户 2' UNION ALL
    SELECT '账户 3', '出',5,'账户 7' UNION ALL
    SELECT '账户 3', '出',7,'账户 7' UNION ALL
    SELECT '账户 3', '出',5,'账户 7' UNION ALL
    SELECT '账户 3', '出',4,'账户 9' UNION ALL
    SELECT '账户 6', '进',7,'账户 4' UNION ALL
    SELECT '账户 6', '进',8,'账户 10' UNION ALL
    SELECT '账户 6', '出',5,'账户 10' UNION ALL
    SELECT '账户 6', '出',7,'账户 11' UNION ALL
    SELECT '账户 6', '进',5,'账户 7' UNION ALL
    SELECT '账户 8', '出',6,'账户 4' UNION ALL
    SELECT '账户 9', '出',3,'账户 8' ),
    tt as (SELECT 
    CASE 标志 when '出' then 实体A ELSE 实体B end id1,
    CASE 标志 when '出' then 实体B ELSE 实体A end id2,
    sum(交易金额) 交易金额 FROM T 
    group by 
    CASE 标志 when '出' then 实体A ELSE 实体B end,
    CASE 标志 when '出' then 实体B ELSE 实体A end),
    cte as (
    select distinct cast('0' AS  VARCHAR(1000)) id1,id1 id2,cast(id1 as VARCHAR(100)) root_node,cast(id1+'/' as VARCHAR(1000)) path, 0 lvl,0 amt from tt where id1='账户 1'
    union all
    select cast(tt.id1 AS  VARCHAR(1000)) ,tt.id2,cte.root_node,cast(cte.path+tt.id2+'/'  as VARCHAR(1000)) path,lvl+1,amt+交易金额 from tt  join  cte on tt.id1=cte.id2
    where  PATH NOT LIKE '%'+tt.id2+'/%'
    )
    select  root_node,id2,path,amt from cte where id2='账户 6' ;
    

    img

    你那个汇总转账金额不知道是不是指的每2个节点之间的转账都要先汇总,就是tt表里面那个sum

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月7日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题