`
honeybinshun
  • 浏览: 61187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle多列转行

 
阅读更多
遇到的问题描述如下:
现有如下数据格式(待转换表):
month_no kpi_code  011  013  023  018  032
201207   ABCD0001   12   12   12   12   12
201207   ABCD0002   12   12   12   12   12
201207   ABCD0003   12   12   12   12   12
201207   ABCD0004   12   12   12   12   12
201207   ABCD0005   12   12   12   12   12
(列011,013,023,018等实际作为转换后的prov_id并且实际应用中,prov_id不止示例中的五个)
转换为:
month_no  prov_id  kpi_code  kpi_value
201207      011     ABCD0001     12
201207      013     ABCD0001     12
201207      023     ABCD0001     12
201207      018     ABCD0001     12
处理过程:
首先,建三张临时表:
-- Create table 待转换表
create table M_TEST
(
  MONTH_NO VARCHAR2(10),
  PROV_ID  VARCHAR2(6),
  YDCB0001 NUMBER,
  YDCB0002 NUMBER,
  YDCB0003 NUMBER,
  YDCB0004 NUMBER,
  YDCB0005 NUMBER,
  YDCB0006 NUMBER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create table 转换后表
create table M_TEST_T
(
  MONTH_ID  VARCHAR2(10),
  PROV_ID   VARCHAR2(6),
  KPI_CODE  VARCHAR2(10),
  KPI_VALUE NUMBER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create table 日志表
create table M_LOG
(
  PROC_NAME VARCHAR2(30),
  PROV_ID   VARCHAR2(10),
  TEST_DATE DATE
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

---转换前至转换后的处理过程
  ----创建存储过程
  create or replace procedure p_m_test_t(month_id varchar2,
                                         prov_no  varchar2,
                                         retinfo  out varchar2) is
  proc_name varchar2(30);
  V_SQL     LONG;
BEGIN
  proc_name := 'P_M_TEST_T';
  V_SQL     := 'INSERT INTO m_test_t'; --结果表
  FOR T IN (select column_name
              from user_tab_columns
             where table_name = 'M_TEST'
               and column_id > 2) LOOP
    V_SQL := V_SQL || ' SELECT MONTH_NO,PROV_ID,''' || T.COLUMN_NAME ||
             ''',' || T.COLUMN_NAME || ' FROM m_test where month_no=' ||
             month_id ||' and (prov_id = '''||prov_no||''' or ''ALL''='''||prov_no||''') UNION ALL ';
  END LOOP;
  V_SQL := RTRIM(V_SQL, ' UNION ALL ');
  DBMS_OUTPUT.put_line(V_SQL);
  EXECUTE IMMEDIATE V_SQL;
  COMMIT;
  --插入日志表信息
  insert into m_log
    (proc_name, prov_id, test_date)
  values
    (proc_name, prov_no, sysdate);
  commit;
  retinfo := ' 结束 ';
EXCEPTION
  WHEN OTHERS THEN
    retinfo := ' 失败 ';
END;
分享到:
评论

相关推荐

    Oracle的列转行问题

    Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。 网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    Oracle逗号分隔列转行实现方法

    因此用到了逗号分隔列转行的方法。目前该方法只适合在oracle数据库中使用。该方法只需要sql语句就可以实现列转行。  下面给出该方法的示例: select a,b,c from(with test as (select ‘aaa’ a,’bbb’ b,’1,2,3...

    oracle游标使用大全1.txt

    oracle游标使用大全,其中有很多例子,有助于大家理解,希望对初学者有帮助

    Oracle行转列

    1. 列转行 列转行是指将多个列数据合并成一个列数据。例如,有一个表t_col_row,其中包含多个列c1、c2、c3,需要将这些列数据合并成一个列数据。可以使用UNION ALL、MODEL和COLLECTION等方法来实现列转行。 使用...

    oracle行列转换

    列转行是指将数据库表中的多个列转换为一行。这种操作可以使用 UNION ALL 语句、MODEL 子句和 COLLECTION 语句来实现。 1. 使用 UNION ALL 语句 UNION ALL 语句可以将多个 SELECT 语句的结果合并成一个结果集。 ...

    Oracle 行列转换 总结

    行列转换包括以下六种情况:  1. 列转行  2. 行转列  3. 多列转换成字符串  4. 多行转换成字符串  5. 字符串转换成多列  6. 字符串转换成多行

    oracle行列转换总结

    行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 内有6种情况的详细分析与SQL

    Oracle Decode()函数使用技巧分享

    今天上头要求做一个类似的功能,初步想到的列转行,但是如何实现也没有什么好办法,这个函数不错DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现...

    Java面试宝典2020修订版V1.0.1.doc

    23、行转列、列换行怎么转 48 24、什么是PL/SQL? 49 25、序列的作用 50 26、表和视图的关系 50 27、oracle基本数据类型 50 28、drop、truncate、 delete区别 50 29、如何优化大数据量的访问? 51 30、oracle怎么...

    经典SQL脚本大全

    │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉表.sql │ 复杂交叉表1.sql │ 多栏显示.sql │ 日期+星期+时间.sql │ 格式化报表.sql │ 横转竖-1.sql │ 横转竖-字段名.sql │ 横转竖-生成字段名.sql │ 横转竖....

    Sqlserver2000经典脚本

    │ │ └─其他 │ 交叉表--复杂名次.sql │ 交叉表-优先级处理.sql │ 交叉表分析.sql │ 分级汇总.sql │ 分组交叉表.sql │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉...

Global site tag (gtag.js) - Google Analytics