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日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来