oracle 查询结果行转列

工作中遇到了这么一个情况:sql查询结果,查出来需要遍历才能取到想要的结果

SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
   START WITH  GROUP_ID = '10809' 
      CONNECT BY   GROUP_ID = PRIOR PARENT_ID

结果

我想要的是结果中,直接用get("C02")直接取得海南省,而不是去遍历list取得,虽然遍历也可以,但本着java代码简单点的初心,相对他动手,预期的sql查询结果想要这样的

这个效果,看样子牵扯到了查询结果行转列。百度开始找,

很多博客说使用聚合函数pivot,我尝试了一下,脑子不好使,我不是为了聚合计算结果,只是单纯的想两级反转而已,于是开始思考奇淫巧技。记录下这个过程。

      SELECT 
      DECODE(LAYER_CODE,'C02',GROUP_NAME,NULL)C02,
      DECODE(LAYER_CODE,'C03',GROUP_NAME,NULL)C03,
      DECODE(LAYER_CODE,'C04',GROUP_NAME,NULL)C04
      FROM 
      (
     SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
	  START WITH  GROUP_ID = '10809' 
      CONNECT BY   GROUP_ID = PRIOR PARENT_ID 
      )
      


以上将结果清晰独立出来:

到这一步,都是用非常简单的sql拼凑的,列名主动给的,结果填充,到此,后面只需要将多行结果合并一行即可如下:

 

      SELECT 
      WM_CONCAT(C02) C02,
      WM_CONCAT(C03) C03,
      WM_CONCAT(C04) C04 
      FROM 
      (
      SELECT 
      DECODE(LAYER_CODE,'C02',GROUP_NAME,NULL)C02,
      DECODE(LAYER_CODE,'C03',GROUP_NAME,NULL)C03,
      DECODE(LAYER_CODE,'C04',GROUP_NAME,NULL)C04
      FROM 
      (
     SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT
	  START WITH  GROUP_ID = '10809' 
      CONNECT BY   GROUP_ID = PRIOR PARENT_ID 
      )
      )

使用oracle的wm_concat()函数,将多行合并

 

结果可得;

以上。

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值