• Oracle行转列操作


    有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式:

    原表结构展示如下:
    ---------------------------
    产品名称    销售额     季度
    ---------------------------
    奶酪          50     第一季度
    奶酪          60     第二季度
    啤酒          50     第二季度
    啤酒          80     第四季度
    ---------------------------

    现在需要将上面的原表结构转换为如下所示的结构形式来展示:
    --------------------------------------------------------------------------
    产品名称   第一季度销售额   第二季度销售额   第三季度销售额   第四季度销售额
    --------------------------------------------------------------------------
    奶酪      50        60               0                0
    啤酒      0        50               0                80
    --------------------------------------------------------------------------

    一、创建销售表sale_hst表结构

    --创建销售表
    create table sale_hst
    (
        prdt_name varchar2(10),--产品名称
        sale_amt number(8),--销售额
        season varchar2(10)--季度
    );

    二、插入基础数据

    --插入如上所示的基础数据
    insert into sale_hst values ('奶酪',50,'第一季度');
    insert into sale_hst values ('奶酪',60,'第二季度');
    insert into sale_hst values ('啤酒',50,'第二季度');
    insert into sale_hst values ('啤酒',80,'第四季度');

    三、使用SQL语句转换

    方案1:使用case...when...then...else...end...语句

    --方案1:使用case...when...then...else...end...语句
    select
        prdt_name,
        sum(case when season='第一季度' then sale_amt else 0 end) 第一季度销售额,
        sum(case when season='第二季度' then sale_amt else 0 end) 第二季度销售额,
        sum(case when season='第三季度' then sale_amt else 0 end) 第三季度销售额,
        sum(case when season='第四季度' then sale_amt else 0 end) 第四季度销售额
    from sale_hst
    group by prdt_name;

    方案2:Oracle下可以用decode函数处理

    说明:

    Oracle下可以用decode函数处理:
    decode函数是Oracle PL/SQL中功能强大的函数之一,目前还只有Oracle公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。

    decode函数功能如下:
    decode(字段或字段的运算,值1,值2,值3)
    这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
    当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多。

    --方案2:Oracle下可以用decode函数处理
    select
        prdt_name,
        sum(decode(season,'第一季度',sale_amt,0)) as 第一季度销售额,
        sum(decode(season,'第二季度',sale_amt,0)) as 第二季度销售额,
        sum(decode(season,'第三季度',sale_amt,0)) as 第三季度销售额,
        sum(decode(season,'第四季度',sale_amt,0)) as 第四季度销售额
    from sale_hst
    group by prdt_name;

    有时候我们又有如下的需求:

    原表的数据形式展示如下:

    shopping表:
    ----------------------------------
    u_id       goods            num
    ----------------------------------
    1           苹果               2
    2           梨子               5
    1           西瓜               4
    3           葡萄               1
    3           香蕉               1
    1           橘子               3
    ----------------------------------

    转换为如下的形式1展示:

    --------------------------------------------
    u_id          goods_sum    total_num
    --------------------------------------------
    1             苹果,西瓜,橘子      9
    2             梨子           5
    3             葡萄,香蕉         2
    --------------------------------------------

    转换为如下的形式2展示:
    ------------------------------------------------------
    u_id          goods_sum          total_num
    ------------------------------------------------------
    1             苹果(2斤),西瓜(4斤),橘子(3斤)    9
    2             梨子(5斤)              5
    3             葡萄(1斤),香蕉(1斤)         2
    ------------------------------------------------------

    一、创建购物表shopping表结构

    --创建购物表shopping
    create table shopping
    (
        u_id number(10),
        goods varchar2(8),
        num number(10)   
    );

     二、插入基础数据

    --插入如上所示的基础数据
    insert into shopping values (1,'苹果',2);
    insert into shopping values (2,'梨子',5);
    insert into shopping values (1,'西瓜',4);
    insert into shopping values (3,'葡萄',1);
    insert into shopping values (3,'香蕉',1);
    insert into shopping values (1,'橘子',3);

    三、使用SQL语句转换

    形式1:

    --形式1的语句
    select u_id, wmsys.wm_concat(goods) goods_sum,sum(num) total_num  from shopping   group by u_id;

    形式2:

    --形式2的语句
    select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum,sum(num) total_num  from shopping  group by u_id;

    说明:

    Oracle中wm_concat(column)函数的使用:
    wmsys用户的wm_concate函数
    Oracle数据库中,使用wm_concat(column)函数,可以进行字段合并,Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据)。wmsys.wm_concat除了单独使用外还可以和over函数结合使用。

  • 相关阅读:
    对silverlight布局进行控制,使其居中显示,适用于不同的分辨率
    图(邻接表链表和边表)
    LINUX下GCC编译sqrt函数问题
    图(邻接矩阵)
    表达式树
    赫夫曼树
    N的阶乘中末尾有几个0
    走迷宫
    HDU1863畅通工程(最小生成树 Kruskal)
    KMP算法
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/4225467.html
Copyright © 2020-2023  润新知