`
honeybinshun
  • 浏览: 62059 次
  • 性别: 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`结合子查询,以及从11g版本开始提供的`PIVOT`功能。选择哪种方法取决于具体的需求和数据规模,以及对性能的考虑。在处理大数据量时,应...

    ORACLE 列转行 DECODE函数用法

    DECODE函数在处理列转行的问题时,尤其适用于将多列数据合并到一行中,使得数据展示更加简洁明了。下面我们将详细讲解DECODE函数的使用方法以及如何在列转行操作中应用它。 DECODE函数的基本语法如下: ```sql ...

    列转行小工具

    在Oracle Developer中,"列转行小工具"是一种实用功能,它主要用于处理数据库表中的数据,将多列数据转换为单列数据,通常涉及到的是数据的行列转换操作。这种操作在处理复杂的数据分析、报表生成或者接口对接时非常...

    DB2 SQL 实现行转列,列转行

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

    oracle 多列分组和行转列 理解和实例

    理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析

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

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

    oracle wm_concat 列转行 逗号分隔

    这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。然而,需要注意的是,WM_CONCAT并不是Oracle官方提供的标准函数,它在Oracle 11g R2版本之后就被标记为不...

    oracle游标使用大全1.txt

    ### Oracle游标使用详解 #### 一、Oracle游标简介 在Oracle数据库中,游标是一种用于处理查询结果集的强大工具。它允许用户通过逐行访问数据来执行复杂的操作,如更新、删除或插入记录等。游标可以分为显式游标和...

    oracle行转列

    - T-SQL_经典行专列、列转行,分页及存储过程.doc:T-SQL是SQL Server的扩展,但其中的行转列和分页概念与Oracle相似。在Oracle中,可以使用ROW_NUMBER()函数配合PARTITION BY和ORDER BY来实现分页查询。 - oracle_...

    Oracle行转列

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

    ORACLE 行列转换

    本文将详细介绍如何在Oracle中实现行转列(即行列转换的一种)以及列转行的操作,分别通过使用`decode`函数和`insert...select`语句来实现。 ### 一、使用`decode`函数进行“行转列” #### 1. **背景与需求** 在...

    Oracle的数据表中行转列与列转行的操作实例讲解

    列转行是将多列数据转换为单一列,通常用于将数据从表格格式转换为列表格式。在Oracle中,可以使用UNION ALL配合列名和值来实现: ```sql -- 列转行示例 select sname, '数学' Course, math Score from Tb_students...

    Oracle SQLServer行列转换

    与行转列相对应的是列转行,这通常用于将多列数据转换为单列的形式。在SQLServer中,可以使用`UNION ALL`来实现这一功能。 ##### 1. 创建数据表并插入数据 首先创建一个包含学生各科成绩的表: - **表结构**: ```...

    Oracle 行列转换 总结

    这种转换有六种情况:列转行、行转列、多列转换成字符串、多行转换成字符串、字符串转换成多列、字符串转换成多行。 1. 列转行 列转行是指将多个列转换成一个行。例如, CREATE TABLE t_col_row(ID INT, c1 ...

    sql经典 oracle的查询结果的行列互换

    `CASE` 语句是一种更灵活且简洁的方法,尤其适用于需要转换的列较多的情况。其基本思想是利用条件表达式来决定将哪些值放入指定的列中。 ```sql SELECT name, SUM(CASE WHEN kecheng = '语文' THEN chengji ELSE 0 ...

    oracle_lhr_行列互换总结

    根据提供的文件信息,我们将详细讨论Oracle中实现行列互换的六种情况,分别为:列转行、行转列、多列转换成字符串、多行转换成字符串、字符串转换成多列、字符串转换成多行。 1. 列转行 列转行是指将表中的列转换为...

Global site tag (gtag.js) - Google Analytics