oracle11g行列转换,交叉表 pivot

介绍了Oracle 11g数据库中新增的PIVOT和UNPIVOT功能,这两种特性允许用户将数据从行格式转换为列格式,或者反之。通过具体的SQL示例演示了如何使用这些功能来简化数据展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Oracle 数据库 11g 推出之前,您需要针对每个值通过使用decode 函数或case语句进行列转换操作, 并将每个不同的值编写为一个单独的列。但是,该方法不是很不直观也不是很方便。                                                                                                                                            oracle11g可以使用一种很好的新特性PIVOT和UNPIVOT,通过一种新的操作符以交叉表格式显示任何查询, oracle为了实现更强大的数据仓库应用,在SQL和PL/SQL方面有很大的加强。

--使用昨天建立的测试表        C:/Documents and Settings/Administrator>sqlplus /nolog              SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 3月 21 09:16:11 2008              Copyright (c) 1982, 2007, Oracle.  All rights reserved.              idle>conn / as sysdba        已连接。        PENG11G(sys)>desc vc_test;         名称                                                  是否为空? 类型         ----------------------------------------------------- -------- ------------------------------------         PNO                                                            VARCHAR2(6)         PNAME                                                          VARCHAR2(10)         SALARY                                                         NUMBER(10,2)         PLEVEL                                                         VARCHAR2(3)              PENG11G(sys)>select * from vc_test;              PNO    PNAME          SALARY PLE        ------ ---------- ---------- ---        000001 张三             1500 PG        000002 李四             2500 SE        000003 王五             4500 SE        000004 周二             1500 PG        000004 刘六             8500 SSE        000006 待定              已选择6行。                    PENG11G(sys)>select plevel, count(1) cnt          2  from vc_test          3  where plevel is not null                             4  group by plevel;                                                                       PLE        CNT                                --- ----------                                SSE          1                                PG           2                                SE           2                         --我们将plevel转换成行            PENG11G(sys)> select * from (                              2           select plevel                                                                   3           from vc_test t                        4        )                                        5        pivot                                    6        (                                        7           count(plevel)                         8           for plevel in ('PG','SE','SSE')         9        )         ;                                                                              'PG'       'SE'      'SSE'                  ---------- ---------- ----------                           2          2          1                --有 pivot 就应该有unpivot                PENG11G(sys)>create table upv_test as                                                          2   select * from (                                                                          3      select plevel                                                                         4      from vc_test t                                                                        5   )                                                                                        6   pivot                                                                                    7   (                                                                                        8      count(plevel)                                                                         9      for plevel in ('PG','SE','SSE')                                                      10   )         ;                                                                                                                                                                         表已创建。                                                                                                                                                                                PENG11G(sys)>desc upv_test;                                                                   名称                                                  是否为空? 类型                         ----------------------------------------------------- -------- ----------------------          'PG'                                                           NUMBER                        'SE'                                                           NUMBER                        'SSE'                                                          NUMBER                                                                                                                    PENG11G(sys)>select * from upv_test;                                                                                                                                                            'PG'       'SE'      'SSE'                                                             ---------- ---------- ----------                                                                      2          2          1                                                                           PENG11G(sys)>select *                                  2    from upv_test                                   3  unpivot                                                                                                     4  (                                                                                5      plevel_count                                                                    6      for plevel in ("'PG'","'SE'","'SSE'")                                           7  ) ;                                                                                                                                      PLEVE PLEVEL_COUNT                                                                      ----- ------------                                                                     'PG'             2                                   'SE'             2                                   'SSE'            1             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值