精华内容
下载资源
问答
  • Oracle 行转 动态出转换

    万次阅读 多人点赞 2018-10-02 13:03:23
    10月的第二天,前天写了个Oracle中行转的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要转出多少个,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来动态转换。然后,趁着...

    10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要转出多少个列,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来动态转换。然后,趁着祖国母亲的生日,这几天放假,整理一下处理方法。

    一、运行环境

    Win10,Oracle Database 11g r2,plsql 12。

    二、效果预览

    1、固定转换列的方法

    2、存储过程处理

    1)调用存储过程

    2)查指定的视图即可

    3、两种方法的关系

    其实原理很简单,就是通过动态sql,去把你不愿意写,或者说是不确定的转换列数,通过查询查出来,拼接进去,然后执行拼接后的sql,创建视图。

    三、存储过程

    create or replace procedure p_RowsToCols(as_sql       in varchar2 --源数据的查询sql
                                            ,as_sql_cols  in varchar2 --动态转换列的查询sql,要求转为列的那列,字段名必须为cols,支持排序
                                            ,as_aggCol    in varchar2 --对应pivot函数的 聚合函数
                                            ,as_changeCol in varchar2 --源数据中,要转为列的字段名
                                            ,as_viewName  in varchar2 --结果输出的视图名,执行完后查此视图即可
                                             ) is
      ls_sql varchar2(4000);
      ls_in  varchar2(4000);
    begin
      --拼接in的内容
      ls_sql := 'select listagg(''''''''||cols||'''''' "''||cols||''"'', '','')within group(order by rn) ' || 
                  'from (select rownum rn, cols from (' || as_sql_cols || '))';
      execute immediate ls_sql
        into ls_in;
    
      --创建视图
      ls_sql := 'create or replace view ' || as_viewName ||' as ' ||
                'select * from (' || as_sql || ') ' ||
                 'pivot (' || as_aggCol || ' for ' || as_changeCol || ' in (' || ls_in || '))';
      execute immediate ls_sql;
    end p_RowsToCols;
    

    四、测试数据及SQL

    贴一下我测试的数据和代码。

    --建表
    --drop table SalesList;
    create table SalesList(
        keHu                varchar2(20),   --客户
        shangPinId          number(8),      --商品Id
        shangPin            varchar2(20),   --商品名称
        salesNum            number(8)       --销售数量
    );
     
    --插入数据
    declare
      --谈几个客户
      cursor lr_kh is 
      select regexp_substr('张三、李四、王五、赵六','[^、]+',1, level) keHu from dual
       connect by level <= 4;
      --进点货
      cursor lr_sp is 
      select level shangPinId, regexp_substr('上衣、裤子、袜子、帽子','[^、]+',1, level) shangPin from dual
       connect by level <= 4;
    begin
      --循环插入
      for v_kh in lr_kh loop
         for v_sp in lr_sp loop
            insert into SalesList
            select v_kh.keHu, v_sp.shangPinId, v_sp.shangPin, floor(dbms_random.value(10,50)) from dual;
         end loop;
      end loop;
      commit;
    end;
    /
    
    --看下源数据
    select * from salesList a;
    
    --固定行转列
    select *
      from (select kehu, shangPin, salesNum from salesList) pivot(
        max(salesNum) for shangPin in (
            '上衣' as 上衣,
            '裤子' as 裤子,
            '袜子' as 袜子,
            '帽子' as 帽子
        )
      );
    
    --动态行转列
    call p_RowsToCols('select keHu, shangPin, salesNum from salesList',
                      'select distinct shangPinId, shangPin cols from salesList order by shangPinId',
                      'max(salesNum)',
                      'shangPin',
                      'sales_RowsToCols');
    
    select * from sales_RowsToCols;

     

    完结!!!!!!!!!!!!!!!!!!!!!!

    结尾来个悲伤的彩蛋,闻者伤心,听者落泪!

    上面介绍的方法是一个很简单的思路,然鹅!!!在找到这个思路之前,我还傻傻的做了另外一个版本,一个比较复杂的版本。。。花了有差不多半天时间。我按照这个思路,刚做完的时候有多开心,现在的我,就有多伤心!!不过不忍心直接del掉,还是在这边记录一下吧,思路大概是这个样几:

    同样是存储过程,传入数据源的查询sql,通过存储过程处理,拼接成完整的pivot函数需要的sql,然后直接执行,查出结果,insert到一张通用的记录表中,然后建一个视图,指向这部分数据。

    完结篇.1 效果预览

    测试数据参考上面的插入sql,同样的数据。

    1、第一个参数:必填,数据源的查询,列数不限,但查询的倒数第二列为转换列,最后一列数据列;

    2、第二个参数:

         1)可为空,内容为要转换出的列的查询sql,可指定表头顺序及显示的表头名称。为空时即从数据源查询的倒数第二列中取distinct值,并不保证排序。

         2)查询结果必须为三列,第一列为数字排序列(不需要的话这列就随便指定一个数字就行),第二列对应数据源中转换列的值,第三列即为对应的表头转换后的名称(如果名称不需要改变,这列跟第二列保持一样就行)。

    3、第三个参数:可为空,内容就是处理完后要查的视图名。为空的话,即默认为tmp_rowToCol。

    完结篇.2 跟pivot的对应关系

    完结篇.3 其他好玩的东西

    1、因为我们这个方法的话是吧查出的内容存到表里,然后通过视图直接指向数据的,刚才指定的视图Sale_RowToCol,具体创建语法,就是下面这个,tmp_RowToCol_XiaoXianNv为数据存储的表,fbs = '1' 表示是转换的实际数据,fguid是本次转换的一个key。

    我们查下这个表中实际的数据,这是一个在首次调用存储过程的时候会创建的一个表,203个字段,不超过这么多列的都可以通过我们的存储过程去转并存储数据。

    然后,这个表的数据是会一直保存着的,emm...好像没啥卵用,不过说不定哪天脑子抽了向往前查查这个还是挺有意思的。。。(说得我自己都不信)

    完结篇.4 贴代码

    csdn的高亮。。好像不太友好

    /**
     * 动态进行行列转换,结果集可在一个可指定的视图中查询(默认为tmp_rowToCol)
     * 适用于把一列的值转成多列,转换效果与Oracle的pivot相同,但不需要写死转换出来的每一个列
     * 转换后的数据所存的实体表为tmp_RowToCol_XiaoXianNv,通过一个guid关联到指定的视图
     * tmp_RowToCol_XiaoXianNv表在此过程中不做删除操作。所以如果永久了怕是数据也会挺多。
     * 如果不需要保留数据的话,可以考虑把这个表建为一个会话级临时表,然后转换结果插入后不提交。
     * 这样在同一会话下可查询,提交或者回滚后数据就不复存在。
     * 
     * 转换思路:
     *     1、通过动态sql,拼接出 for XXX in () 里面那部分内容,然后通过动态sql执行并把结果插入一个表中
     *     2、获取固定列、转出列的列名,进行拼接,然后创建视图指向上一步插入的数据
     * 
     * author: lhy
     * date: 2018-10-01 祖国万岁
     * 
     * as_sql             要转换的数据源查询
     *                    对查询结果集的要求:至少3列,
     *                        最后一列为数据值
     *                        倒数第二列为要转成列的内容
     *                        前面的就是不需转换的列
     * as_sql_col         查询要转的列名,如果不指定,即从as_sql的查询的倒数第二列中获取distinct值
     *                    对查询的结果集要求:必须为三列
     *                        对应pivot函数中的:for xxx in('值1' as colNm1,'值2' as colNm2 ...)
     *                        第一列:排序列,要求为数字
     *                        第二列:值(值1..值2)
     *                        第三列:字段名(colNm1..colNm2)
     *                        当然,你不care最后结果的字段的排序和字段名的话,第一列您直接指定一个固定值就行,第三列跟第二列一样也行
     * as_tableName       指定一个视图名来存放转换后的数据,调用存储过程后,通过此视图查询结果集
     */
    create or replace procedure p_rowToCol(as_sql in varchar2, as_sql_col in varchar2, as_viewName in varchar2) is
       lr_curid          integer;            --游标id
       ls_cnt            number(8);          --计数用
       ls_sql            varchar2(4000);     --sql语句
       ls_sql_col        varchar2(4000);     --同 as_sql_col
       ls_rsltTab        dbms_sql.desc_tab;  --存放返回的结果集
       ls_viewName       varchar2(200);      --转换结果存放的表名
       ls_guid           varchar2(50);       --当次转换的guid
       ls_aggColNm       varchar2(50);       --对应pivot的聚合列的列名
       ls_changeColNm    varchar2(50);       --转换列的列名
       ls_cnt_col        number(8);          --要转换出来的列数
       ls_in_text        varchar2(4000);     --对应for()的内容
       ls_cnt_end        number(8);          --最终查询结果的列数
       ls_sql_end        varchar2(4000);     --最终的插入语句
       ls_col_add        varchar2(4000);     --存放转出的列名
       ls_col_fixed      varchar2(4000);     --存放不需要转换的列名
       ls_col_insert     varchar2(4000);     --存放插入的字段
       ls_col_view       varchar2(4000);     --视图的字段
       ls_sql_view       varchar2(4000);     --存放最后的视图的sql
       ls_thead          varchar2(4000);     --拼接一个表头出来,说不定可以回查
    
    begin
      --两步准备工作,其实如果做过一次,后面的代码中其实都不需要执行这两步了
    
       --准备工作1、看下是否存在tmp_RowToCol_XiaoXianNv这个表,首次使用不存在的话建一个(用于存放转换后的数据)
       select count(*) into ls_cnt from all_tables where table_name = upper('tmp_RowToCol_XiaoXianNv');
       if ls_cnt = 0 then
          ls_sql := 'create table tmp_RowToCol_XiaoXianNv(fguid varchar2(50),fopdt date default sysdate,fbs varchar2(8),';
          for i in 1..200 loop
             if i = 200 then
                ls_sql := ls_sql || 'C' || i || ' varchar2(4000))';
             else
                ls_sql := ls_sql || 'C' || i || ' varchar2(4000),';
             end if;
          end loop;
          execute immediate ls_sql;
          --怕以后数据多查询慢的话还可以建个索引给fguid字段
          execute immediate 'create index IDX_ROWSTOCOLS_FGUID on tmp_RowToCol_XiaoXianNv (fguid)';
       end if;
    
       --准备工作2、看下是否存在一个tmp_XiaoXianNv_t1这个临时表,首次使用不存在的话建一个(用于处理转换列排序)
       select count(*) into ls_cnt from all_tables where table_name = upper('tmp_XiaoXianNv_t1');
       if ls_cnt = 0 then
          ls_sql := 'create global temporary table tmp_XiaoXianNv_t1(fseq NUMBER(20),c1 VARCHAR2(4000),c2 VARCHAR2(4000)) on commit delete rows';
          execute immediate ls_sql;
       end if;
    
       --取个guid,准备开干
       --这个就是这一次转换的的key,以后要找这次转换的数据都可以拿着这个key到tmp_RowToCol_XiaoXianNv找
       --所以其实也可以通过传参来手动指定这个key,然后以后想查回来这次的数据都会比较方便
       ls_guid := sys_guid();
    
       --获取转换列和聚合列的列名,即as_sql查询结果的倒数两列
       ls_sql     := as_sql;
       lr_curid   := dbms_sql.open_cursor;
       dbms_sql.parse(lr_curid, ls_sql, dbms_sql.native);
       dbms_sql.describe_columns(lr_curid, ls_cnt, ls_rsltTab);
       ls_changeColNm := ls_rsltTab(ls_cnt - 1).col_name;      --倒数第2列,获取转换列列名
       ls_aggColNm    := ls_rsltTab(ls_cnt).col_name;          --倒数第1列,获取聚合列列名
       ls_cnt         := ls_cnt - 2;                           --不需要转换的列数
    
       --拼接不需要转换的列名,用于后面建视图(part 1)
       for i in 1..ls_cnt loop
          ls_col_fixed := ls_col_fixed || ls_rsltTab(i).col_name || ', ';
       end loop;
       dbms_sql.close_cursor(lr_curid);
    
       --拼接 for xxx in ('值1' as colNm1,'值2' as colNm2 ...) 部分
       --获取所有列名并拼接
       --1、先把所有列名的查询sql搞定
       if as_sql_col is null then
          ls_sql_col := 'select rownum rn, c1, c1 c2 from (select distinct '|| ls_changeColNm || ' c1 from (' || as_sql || ') order by ' || ls_changeColNm || ')';
       else
          ls_sql_col := as_sql_col;
       end if;
    
       --2、把转换列的数据插入到临时表
       execute immediate 'delete from tmp_XiaoXianNv_t1';
       ls_sql        := 'insert into tmp_XiaoXianNv_t1 (fseq, c1, c2) '|| ls_sql_col;
       execute immediate ls_sql;
    
       --3、ls_cnt_col count出要转换出的列数
       execute immediate 'select count(*) from tmp_XiaoXianNv_t1' into ls_cnt_col;
       --顺便算一下最终查询结果的列数
       ls_cnt_end := ls_cnt + ls_cnt_col;
    
       --4、拼接for xx in () 里面的内容
       ls_sql := 'select listagg(''''''''||c1||'''''' ''||c2 , '', '') within group(order by fseq ) from tmp_XiaoXianNv_t1 a';
       execute immediate ls_sql into ls_in_text;
    
       --5、顺便拼接出行转列转换出来的字段名,用于后面建视图(part 2)
       ls_sql := 'select listagg(c2,'','')within group(order by fseq) from tmp_XiaoXianNv_t1';
       execute immediate ls_sql into ls_col_add;
    
       --拼接插入的表的字段 tmp_RowToCol_XiaoXianNv(c1,c2,c3...)
       select listagg(col, ', ') within group(order by rn)
         into ls_col_insert
         from (select rownum rn, 'c' || rownum col
                 from dual
         connect by rownum <= ls_cnt_end);
    
       --拼接pivot的insert sql,插入内容,fbs为标识字段,标记为1,即为正式数据
       ls_sql_end      := 'insert into tmp_RowToCol_XiaoXianNv (fguid,fbs,' || ls_col_insert || ') '
                          ||'select '''|| ls_guid ||''' fguid,''1'',t.* from ('
                          || as_sql || ') PIVOT(max(' || ls_aggColNm || ') for ' || ls_changeColNm || ' in ('
                          || ls_in_text || ')) t' ;
       execute immediate ls_sql_end;
       commit;
       
       --拼接表头的字段
       ls_thead        := ls_col_fixed || ls_col_add;
       ls_thead        := replace(ls_thead,' ');
       ls_col_view     := ls_thead;     --转存一下给下面拼接视图的使用
       
       select listagg(''''||col||'''',',')within group(order by rn) 
         into ls_thead from (
              select level rn, regexp_substr(ls_thead,'[^,]+',1,level) col 
                from dual connect by level <= ls_cnt_end
         );
    
       --拼接pivot的insert sql,插入内容,fbs为标识字段,标记为转换后的字段数,即ls_cnt_end变量,即为正式数据
       ls_sql          := 'insert into tmp_RowToCol_XiaoXianNv (fguid,fbs,' || ls_col_insert || ') values('''|| ls_guid ||''','''||ls_cnt_end||''','||ls_thead||')';
       execute immediate ls_sql;
       commit;
    
       --拿到结果视图名,默认为tmp_rowToCol
       if as_viewName is null then
          ls_viewName := 'tmp_rowToCol';
       else
          ls_viewName := as_viewName;
       end if;
    
       /***************************************这部分的代码可以直接删掉************************************
       --上面是根据前面的数据拼接出来的视图的字段ls_col_view,如果我们是只知道一个guid的时候,我们其实也可以去从数据表中查出表头,然后拼接
       ls_sql         := 'select max(fbs) from tmp_RowToCol_XiaoXianNv where fguid = '''||ls_guid||''' and fbs <> ''1''';
       execute immediate ls_sql into ls_cnt_end;  --获取列数
       
       select listagg(col,'||'',''||')within group(order by rn) 
         into ls_sql from (
              select level rn, 'C'||level col from dual connect by level <= ls_cnt_end
         );
       
       ls_sql         := 'select '|| ls_sql || ' from tmp_RowToCol_XiaoXianNv where fguid = '''||ls_guid||''' and fbs <> ''1''';
       execute immediate ls_sql into ls_col_view; --获取视图列名ls_col_view,这里得到的跟上面获取到的是一样的
       **********************************************************************************************/
    
       --拼接视图的字段别名转换关系  c1 字段1, c2 字段2 ...
       select listagg(c1||' '||col,',')within group(order by rn) 
         into ls_col_view from (
              select 'C'||level c1, level rn, regexp_substr(ls_col_view,'[^,]+',1,level) col 
                from dual connect by level <= ls_cnt_end
         );
    
       --视图呈现
       ls_sql_view     := 'create or replace view '|| ls_viewName ||' as select '|| ls_col_view || ' from tmp_RowToCol_XiaoXianNv where fbs = ''1'' and fguid = '''|| ls_guid || '''';
       execute immediate ls_sql_view;
    
    end p_rowToCol;
    
    

    完结篇.5 测试SQL

    
    --建表
    --drop table SalesList;
    create table SalesList(
        keHu                varchar2(20),   --客户
        shangPinId          number(8),      --商品Id
        shangPin            varchar2(20),   --商品名称
        salesNum            number(8)       --销售数量
    );
     
    --插入数据
    declare
      --谈几个客户
      cursor lr_kh is 
      select regexp_substr('张三、李四、王五、赵六','[^、]+',1, level) keHu from dual
       connect by level <= 4;
      --进点货
      cursor lr_sp is 
      select level shangPinId, regexp_substr('上衣、裤子、袜子、帽子','[^、]+',1, level) shangPin from dual
       connect by level <= 4;
    begin
      --循环插入
      for v_kh in lr_kh loop
         for v_sp in lr_sp loop
            insert into SalesList
            select v_kh.keHu, v_sp.shangPinId, v_sp.shangPin, floor(dbms_random.value(10,50)) from dual;
         end loop;
      end loop;
      commit;
    end;
    /
    
    --查看下数据
    select * from salesList a; 
    
    --固定行转列
    select *
      from (select kehu, shangPin, salesNum from salesList) pivot(
        max(salesNum) for shangPin in (
            '上衣' as 上衣数量,
            '裤子' as 裤子数量,
            '袜子' as 袜子数量,
            '帽子' as 帽子数量
        )
      );
    
    --动态行转列
    call p_rowtocol('select keHu, shangPin, salesNum from SalesList',
                    '',
                    'Sale_RowToCol');
    
    select * from Sale_RowToCol; 
    
    --完整版
    call p_rowtocol('select keHu 客户, shangPin, salesNum from SalesList',
                    'select distinct shangPinId, shangPin, shangPin||''数量'' from salesList order by shangPinId',
                    'Sale_RowToCol');
    
    select * from Sale_RowToCol;
    
    --数据存储的表
    select * from tmp_RowToCol_XiaoXianNv

    结束语?没有

    啊对,这个存储过程中有建表和建视图的语法,如果你的用户没有权限的话需要用dba用户给一下权限:

    grant create table to user;

    grant create view to user;

     

    ================2019年4月25日 更新================

    评论区一个小伙伴报的bug。

    拼接出来的sql语句,pivot(xxx for xxx in ('0' 0, '1' 1, '2' 2)) 的这部分,当列为纯数字的时候,别名要加个双引号。

    就是说,拼接出来的应该是 pivot(xxx for xxx in ('0' "0", '1' "1", '2' "2")) 才对。

    修改内容:代码的11行,拼接列别名的时候,添加个双引号把列名包住

    更新后代码如下:

    嗯,再次感谢提bug的小伙伴。

    展开全文
  • oracle 将一列数据转成1行数据

    千次阅读 2012-12-06 12:38:39
    select wm_concat(name) name from user;--10g写法 select listagg(name,',') within group (order by name) name from user;--11g写法
    select wm_concat(name) name from user;--10g写法
    
    select listagg(name,',') within group (order by name) name from user;--11g写法
    展开全文
  • 记录一下自己今天遇到的个 实际的问题,客户在使用的个系统中,其中一张表的主键以前定义的是...第反应就是去数据库Number类型改成varchar类型,但是在改的时候,会提示你要修改数据类型,则要修改的必须

            记录一下自己今天遇到的一个 实际的问题,客户在使用的一个系统中,其中一张表的主键以前定义的是Number型,通俗来说就是数字 类型。主键使用序列进行生成的,后来在代码重构以后,主键改为随机生成的一个16位的字符串。将字符串类型的数据往Number类型的字段里面插入时,是会报错的。第一反应就是去数据库将Number类型改成varchar类型,但是在改的时候,会提示你要修改数据类型,则要修改的列必须为空。那么问题来了,如何将一列已有数据的字段类型进行改变呢?

            现在来仔细说一下问题的解决方案,操作如下:

            1.在操作数据库的时候一定要谨慎,所以首先我们先将这张表进行备份,create table  新建的表名  as select * from table(注意某些字段是有默认值的,不要掉)

          2.将要修改类型的字段进行重命名,alter table  表名 rename column DBID to DBID1;(将 主键dbid重命名为dibid1)

          3.在表中新建一个原来的字段,ALTER TABLE 表名 ADD DBID  VARCHAR2(100); 

          4.将原来那一列的数据进行类型转换后给现在的字段,UPDATE 表名 t SET t.dbid = to_char(t.dbid1); 

          5.删除原来的字段,ALTER TABLE y_ent_cert  DROP COLUMN dbid1; 

          6.将现在的dbid设为主键,alter table 表名 add constraint pk_id primary key(id);

    再次提醒,数据操作需谨慎,切记做好备份。。。

    展开全文
  • oracle 列数据合并成一列显示

    万次阅读 2017-06-29 09:53:43
    oracle列数据显示成一列 ,2列数据合并在一起显示

    将多列数据合并成一列数据显示

    方法一:执行update语句,之后select 出来,这个不是本次的重点

    方法二:不执行update语句,直接select出来的时候就显示了,但是不改变表结构和数据

    (A)若合并的数据只是简单的将字符串拼接的话,就要看即将合并的两列是不是varchar2格式 ,如不是,sql必须条用cast函数

    例子:

    表:IPPORT : creat table IPPORT (ip varchar2(50) ,port  NUMBER);

    数据: insert into IPPORT(ip,port)values("127.0.0.0",8080);

    目的:显示一列IP+端口显示,如127.0.0.0:8080

    sql:select IP||‘:’||cast(port as varchar2(10)) as ipport from IPPORT;

    视图:

    (B)若执行的是需要将连个数字相加,则必须将列调用cast转为num类型,之后相加就可以了

    如上例子假设IP也是数字类型的,则是

    select (cast(ip as number)+port) shuzi from IPPORT;

    展开全文
  • 比如我这里又个字段是name,然后有多行 name 小红 小明 然后我想让小红,小明在行显示, wm_concat(name) 则显示为 name 小红,小明
  • oracle实现某一列的值转换为列标题

    千次阅读 2016-08-09 16:59:43
    步骤:创建测试表 CREATE TABLE EMP ( EMPNO NUMBER(4), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) ); 步骤二:...
  • select running_time, running_user, algorithm_id, algorithm_list_id, ...在该过程中需要注意的是我们调用了oracle数据库的系统函数wm_connect()函数,但是该函数又要必须调用to_char(列名)才能生效
  • oracle一数据转换成多行数据

    千次阅读 2014-12-23 00:24:05
    实际开发中我们经常遇到需要一张临时表的数据来作为 关联表,当然我们可以通过create一张表来满足我们的需求,但是如果是线上环境不允许我们建表... 数据转换成多行数据" TITLE="oracle 数据转换成多行数据
  • ORACLE通过SQL将一数据转换为多行

    千次阅读 2019-04-17 10:35:00
    转换前和需要转成的格式如下图: sql语句如下: SELECT YJKEY, REGEXP_SUBSTR(ADDUSERCD, '[^,]+', 1, LEVEL, 'i') AS ADDUSERCD FROM (SELECT 100000004018 AS YJKEY, '1,2,3' AS ADDUSERCD FROM DUAL) T ...
  • 今天写的个sql语句,调用合作方的视图,查询结果跟用数据库客户端查询出来的数据结果有偏差,查了相关文档,oracle数据类型如果是number时,当值超过16位会自动做四舍五入。 注:我在客户端执行SQL的时候是正常的...
  • oracle中多行数据转换为多

    千次阅读 2014-09-15 17:39:16
    CREATE OR REPLACE VIEW VIEW_LC_REALDATA_DY ASSELECTterminalno,terminalname,terminaltime,servertime,direction,MAX(DECODE(dataitemno,'1',receivedata)) AS ady,MAX(DECODE(dataitemno,'2',receivedata)) AS...
  • oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数,查询结果合并为行显示。
  • oracle列转换成行

    千次阅读 2019-05-31 21:21:00
    转行 select name "姓名", sum(decode(salary_type,'基本工资',cnt ,0)) "基本工资", sum(decode(salary_type,'交通补贴',cnt ,0)) "交通补贴'", sum(decode(salary_type,'全勤奖',cnt ,0)) "全勤奖", sum(decode...
  • Oracle将一列分成多列 和 行转列

    千次阅读 2019-02-14 14:48:15
    一列分成多列方法: 1.SELECT REGEXP_SUBSTR(name,'^[^ ]*') first_name, REGEXP_SUBSTR(name, '([[:alpha:]]+)$') middle_name FROM CELEBRITY 2.SELECT SUBSTR(NAME, 1, INSTR(NAME, ' ')-1) FIRST_NAME, SUBSTR...
  • ORACLE常用日期函数与日期转换格式化函数 Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:007 yyyy four digits 四位年 显示值:2007 Month: mm number 两位月...
  • 【问题】 Oracle11g 导出数据时出现 . . 正在导出表 ACCEPTORDER导出了 0 行 . . 正在导出表 CASHPAY导出了 0 行 . . 正在导出表 CMS_CHANNEL导出了 11
  • Oracle数据类型转换

    千次阅读 2013-11-01 11:59:18
    隐式和显式数据转换 Oracle建议具体指定显示转换,而不是依赖隐式或自动转换,因为这些原因: 使用显示数据类型转换函数,SQL语句更容易理解。
  • oracle中行,转换(求和)

    万次阅读 2016-10-10 22:27:01
    1.有些时候因为业务的需求,需要平时在数据库中查询的的转换为行的形式。 普通查询的结果(select t.* from table t) 业务需求的结果 2,这里我使用的是sum(),decode()函数select k.id, sum(aaa) as aaa...
  • oracle数据类型转换

    千次阅读 2017-12-14 12:14:58
    假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的必须为空”,这时要用下面方法来解决这个问题:/修改原字段名name为name_tmp/ alter table tb rename column name to ...
  • 在实际统计中,我们可能需要对统计的数据进行行列转换以达到我们想要的更便于分析查看对比的格式。例如:我们想要统计在时间(过去一年或个月)所有客户在24小时的消费情况。对于结果我们更愿意让行记录标识...
  • ORACLE行转转行

    千次阅读 2018-11-23 17:44:24
    行转列:把一行多列数据转换成一列多行数据 列转行:把一列多行数据转换成一行多列数据 ORACLE-行转列-unpivot 数据准备 -- 此表用于表示某人四个季度的收入:用于行转列测试 create table t_t...
  • 一列的月份是根据时间区间查询出来的,参数为起始时间和结束时间,随着参数的不同时间区间会发生变化,但都是连续的,格式也是固定的,所以转换为一行数据的列数也是随之变化的,希望大神可以帮我实现想要的效果
  • 、使用oracle函数: TO_TIMESTAMP_TZ('2009-3-9 17:51:23.23 -05:00', 'YYYY-MM-D HH24:MI:SS.FF TZH:TZM') TO_DATE(yourdate,'YYYY-MM-D HH24:MI:SS'); // 字符串转日期Date T0_CHAR(yourdate,'YYYY-MM-D HH24...
  • Oracle DB 隐式和显示数据类型转换

    千次阅读 2013-10-17 09:22:44
    但是,Oracle Server 会在内部这些数据类型转换Oracle 数据类型。 在某些情况下,Oracle Server 会收到数据类型与预期的数据类型不同的数据。发生这种情况时,Oracle Server 可自动数据
  • oracle数据隐式转换规则

    千次阅读 2010-11-29 09:56:00
    oracle数据隐式转换规则
  • Oracle之纵向数据转换横向数据

    千次阅读 2014-07-25 11:07:33
    表结构中,每个员工id对应有多个薪资项目以及金额,需要查询时转向,每个员工的薪资项目转为横向行显示。 在直接查询(加入一些限制条件以缩小结果集), Sql代码  SE
  • Oracle 11g 导出数据报 “ORA-01455: 转换列溢出整数数据类型”的问题 最近发现云服务器上的Oracle 11g在导出时报错,如下: ... . 正在导出后期表活动 . 正在导出实体化视图 . 正在导出快照日志 EXP-...
  • ORACLE将分隔数据转换为多值IN列表

    千次阅读 2009-12-06 19:51:00
    看看下面的语句select ename,sal,deptnofrom empwhere empno in(7654,7698,7782,7788)这个语句是错误的,因为DEPTNO是个数值,而此IN列表是个字符串值,所以此SQL语句会失败。现在要此字符串转换为用逗号...
  •  ORA-01455: 转换列溢出整数数据类型  EXP-00000: 导出终止失败  据现象观察,出现此错误之前,大多数记录数为0的正式表(不是临时表)没有被导出。  查阅资料,得到原因是Oracle11g增加了参数deferred_segm...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,880
精华内容 34,352
关键字:

oracle将一列时间数据转换格式