AI教我一条SQL实现明细转树形结构

AI教我一条SQL实现明细转树形结构

1. 原始数据

序号COUNTRYPROVINCECITYGAME
1中国广东深圳地心侠士
2中国广东广州地心侠士
3中国江苏南京地心侠士
4美国加州洛杉矶地心侠士

2. 目标数据

序号节点名称节点ID父级节点ID国家城市微信小游戏
1美国美国0美国
2加州美国加州美国美国加州
3洛杉矶美国加州洛杉矶美国加州美国加州洛杉矶地心侠士
4中国中国0中国
5广东中国广东中国中国广东
6广州中国广东广州中国广东中国广东广州地心侠士
7深圳中国广东深圳中国广东中国广东深圳地心侠士
8江苏中国江苏中国中国江苏
9南京中国江苏南京中国江苏中国江苏南京地心侠士

3. 实现思路

从一个明细数据,提取多余的父级信息,可以使用不同维度的分组进行提取.可以逐层获取,也可以使用GROUPING SETS
减少分组代码量.比如以上提供的目标数据中可以如下汇总实现:

  • 汇总国家层级,按照country分组汇总,得到中国,美国,两条数据
  • 汇总省份层级,按照country,province,得到中国广东,中国江苏,美国加州三条数据
  • 汇总明细数据,直接按照所有列进行分组,得到明细数据

以上步骤,可以解决数据问题,但是数据之间的层级关系体现不出来,需要添加三列,分别表示节点名称,节点ID,父级节点ID
可以说使用分组函数GROUPING_ID实现,分组列为二进制,包含分组为0不包含为1,国家,省,明细三个分组值依次为

  • 汇总国家层级 GROUPING_ID(country, province, city),二进制 011 十进制 3,节点名称 country 节点ID country 父级节点ID ‘0’
  • 汇总省份层级 GROUPING_ID(country, province, city),二进制 001 十进制 1,节点名称 province 节点ID country||province 父级节点ID country
  • 汇总明细层级 GROUPING_ID(country, province, city),二进制 000 十进制 0,节点名称 city 节点ID country||province||city 父级节点ID country||province

分组函数详细参考可以查看 sql分组 group by rollup,cube,grouping sets,group_id,groupingId

WITH region_data AS (
  SELECT '中国' as country, '广东' as province, '深圳' as city ,'地心侠士' as game FROM dual UNION ALL 
  SELECT '中国', '广东', '广州' ,'地心侠士' FROM dual UNION ALL
  SELECT '中国', '江苏', '南京','地心侠士' FROM dual UNION ALL
  SELECT '美国', '加州', '洛杉矶','地心侠士' FROM dual
)
SELECT 
    CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN city
        WHEN GROUPING_ID(country, province, city) = 1 THEN province
        WHEN GROUPING_ID(country, province, city) = 3 THEN country
    END AS 节点名称,
   CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN country||province||city
        WHEN GROUPING_ID(country, province, city) = 1 THEN country||province
        WHEN GROUPING_ID(country, province, city) = 3 THEN country
    END AS 节点ID,
     CASE 
        WHEN GROUPING_ID(country, province, city) = 0 THEN country||province
        WHEN GROUPING_ID(country, province, city) = 1 THEN country
        WHEN GROUPING_ID(country, province, city) = 3 THEN '0'
    END AS 父级节点ID,
    country AS 国家,
    province AS,
    city AS 城市,
    game as 微信小游戏
FROM region_data
GROUP BY GROUPING SETS (
    (country, province, city,game),
    (country, province),     
    (country)               
)
ORDER BY country, province nulls first, city nulls first;

前端构造树形结构数据,传递给前端有时有特殊字符,方便处理,可以统一转换成16进制串,针对节点ID,父级节点ID,

  function NODEID_TO_RAWID(str in varchar2) return varchar2 is
    new_str varchar2(1000);
    -- 微信公众: 小满小慢 20251113
  begin
    new_str:=UTL_RAW.CAST_TO_RAW(str);
    return new_str;
  end;

4. 总结

实现过程使用AI辅助生成测试代码,通过一次交互提示词,返回目标代码.关注微信公众号[小满小慢],回复关键词AIGROUP可获取具体提示内容.

原文地址: https://mp.weixin.qq.com/s/9_A6cgohb8sX1N0RME0usQ

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值