Oracle实现动态行转列

oracle中要实现行转列的方式有很多种,比如case when …else …end 、wm_concat()函数,lag() over() 、lead() over() 函数等,以及11g版本后的pivot函数都可实现。可根据具体的需求选取不同的方式。
前两天恰好一朋友问起如何将如下表1动态转成表2的形式。
表1在这里插入图片描述
表2在这里插入图片描述
,channel_flag是查数据字典得到,值是变动的。当时第一反应是使用pivot函数。pivot函数语法是pivot(聚合函数 for 列名 in(类型))。尝试了几次,in后接子查询均报错,查资料得知若后接子查询,只能使用pivot xml函数,显然xml格式不符合需求。故最终选择使用存储过程来实现。最终的实现过程如下:

  CREATE OR REPLACE PROCEDURE p_tmp20190730  AUTHID CURRENT_USER IS
  V_SQL VARCHAR2(2000);

  CURSOR CURSOR_1 IS SELECT DISTINCT channel_flag FROM tmp20190730 ORDER BY channel_flag;

    BEGIN
      V_SQL := 'SELECT prod_code';

      FOR v_channel_flag IN CURSOR_1
      LOOP
        V_SQL := V_SQL || ',' || 'MAX(DECODE(channel_flag,''' || v_channel_flag.channel_flag ||
                 ''',isallow,null)) AS '  || '"' || v_channel_flag.channel_flag || '"' ;
      END LOOP;
      V_SQL := V_SQL || ' FROM tmp20190730 GROUP BY prod_code';
      DBMS_OUTPUT.PUT_LINE(V_SQL);
      V_SQL := 'CREATE TABLE TMP_RESULT  AS '||  V_SQL;
      EXECUTE IMMEDIATE V_SQL;
    END;

tmp20190730为表1,最终结果tmp_result为表2.过程加
AUTHID CURRENT_USER防止出现执行存储过程权限不足。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值