Oracle pivot & unpivot

pivot & unpivot 11g新特性

1     pivot

-对的形式出现,典型的行转列报表函数

create table test_demo(id int,name varchar(20),nums int);  ---- 创建表
insert into test_demo values(1, ‘苹果‘, 1000);
insert into test_demo values(2, ‘苹果‘, 2000);
insert into test_demo values(3, ‘苹果‘, 4000);
insert into test_demo values(4, ‘橘子‘, 5000);
insert into test_demo values(5, ‘橘子‘, 3000);
insert into test_demo values(6, ‘葡萄‘, 3500);
insert into test_demo values(7, ‘芒果‘, 4200);
insert into test_demo values(8, ‘芒果‘, 5500);
commit;
 
select name, sum(nums)
  from test_demo
 group by name;
 
select *
  from (select name, nums fromtest_demo)
pivot(sum(nums)
   for name in(‘苹果‘, ‘橘子‘, ‘葡萄‘, ‘芒果‘));
 
SQL> select *
  2    from (select name, nums from test_demo)
  3  pivot(sum(nums)
  4     for name in(‘苹果‘ as "苹果", ‘橘子‘, ‘葡萄‘, ‘芒果‘));  --别名使用
        苹果       ‘橘子‘       ‘葡萄‘       ‘芒果‘
---------- ---------- ---------- ----------
      7000       8000       3500       9700

这里再说语法:

pivot聚合函数 for 列名 in 类型 ,其中 in 中可以指定别名,in中还可以指定子查询,比如 select distinct code from customers

2     unpivot

典型的列转行报表函数

create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int,Q4 int);
这里Q1 int, Q2int, Q3 int, Q4 int表示四季度。
insert into Fruit values(1,‘苹果‘,1000,2000,3300,5000);
insert into Fruit values(2,‘橘子‘,3000,3000,3200,1500);
insert into Fruit values(3,‘香蕉‘,2500,3500,2200,2500);
insert into Fruit values(4,‘葡萄‘,1500,2500,1200,3500);
commit;
select * from Fruit;
 
select id , name, quarter, sell from Fruit unpivot (sell for quarterin (q1, q2, q3, q4));

注意:unpivot没有聚合函数,quarter、sell字段也是临时的变量。

这里sell是统计值,quarter表示季度及类型。

执行结果:

SQL> select id , name, quarter, sell from Fruit unpivot (sell forquarter in (q1, q2, q3, q4));
                                    ID NAME                QUARTER                                    SELL
--------------------------------------- -------------------- ----------------------------------------------
                                     1 苹果                 Q1                                         1000
                                     1 苹果                 Q2                                         2000
                                     1 苹果                 Q3                                         3300
                                     1 苹果                 Q4                                         5000
                                     2 橘子                 Q1                                         3000
                                     2 橘子                 Q2                                         3000
                                      2 橘子                 Q3                                         3200
                                     2 橘子                 Q4                                         1500
                                     3 香蕉                 Q1                                         2500
                                     3 香蕉                 Q2                                         3500
                                     3 香蕉                 Q3                                         2200
                                     3 香蕉                 Q4                                         2500
                                     4 葡萄                 Q1                                         1500
                                     4 葡萄                 Q2                                         2500
                                     4 葡萄                 Q3                                         1200
                                     4 葡萄                 Q4                                         3500

Oracle pivot & unpivot

时间: 2024-09-29 09:47:25

Oracle pivot & unpivot的相关文章

SQL Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

如何在SQL中产生交叉式数据表(枢纽分析表)Part 2(PIVOT,UNPIVOT)

之前小喵使用SQL2000的时候,为了产生交叉数据表(Excel中称为枢纽分析表),小喵用了以下这篇的方式来处理 http://www.dotblogs.com.tw/topcat/archive/2008/04/14/2909.aspx 这样的方式在SQL 2005里面一样可以用,不过2005又新增了一个更方便的东西,可以更简洁的来处理.这个东西就是[PIVOT],神奇的是,除了可以透过PIVOT产生交叉数据表,还可以透过UNPIVOT将交叉数据表转回原来的方式(这对于有些数据表的正规化很有帮

oracle pivot 和 unpivot 函数的使用

pivot的格式select from( inner_query)pivot(aggreate_function for pivot_column in ( list of values))order by ...;用法举例:select from (select month,prd_type_id,amountfrom all_sales)pivot (sum(amount) for month in (1 as JAN,2 as FEB,3 as MAR,4 as APR)) order b

SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5.在SELECT子句中使用子查询 6.WITH子句 子查询(进阶) 7.分析函数 8.行列转换 9.设置数据层次 八.行列转换 pivot和unpivot函数是Oracle 11g增加的新函数,利用此函数可以实现行列转换操作 按照原始方式实现,使用通用函数中的DECODE()函数 列字段的处理 SQ

PIVOT&amp;UNPIVOT

如果是家电销售员,那么可能需要统计每月日销售的彩电.冰箱.空调...最大值.最小值.平均值等 如果你是耳鼻喉科医生,那么可能需要统计月度年度日接客咽炎.喉炎.鼻炎...最大值.最小值.平均值等 如果你是程序媛,那么可能需要统计月度日处理bug.新增功能.支援...等类别问题量的最大值.最小值.平均值等 那么诸如此类问题,需要一行显示一人负责所有相关类别数值时,就是pivot派上用场之时 这类数据结构一般为 create table objecttable(id int primary key i

SQL 行转列 列转行 PIVOT UNPIVOT

1.基础表 2.行转列,注意ISNULL函数的使用,在总成绩的统计中,ISNULL(-,0) 有必要使用 3.列转行,对列语文.数学.英语.政治,进行列转行,转为了2列,score scname 这两列,是新列,可以取名为 score11 scname22,随意 4.测试脚本 SELECT * FROM dbo.SC --插入测试数据 INSERT dbo.SC SELECT NEWID(),'001','jack1','数学',88 UNION SELECT NEWID(),'002','ja

sql server pivot/unpivot 行列互转

有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20), Subject nvarchar(20), Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 ); Insert into @t (StudentName,Subject,Score)

T-Sql Pivot &amp; Unpivot

开门见山:行转列 CREATE TABLE SALESBYQUARTER    (YEAR INT,QUARTER VARCHAR(2),AMOUNT MONEY    ); SET NOCOUNT ON    DECLARE @index INT    DECLARE @q INT    SET @index = 0    DECLARE @year INT    while (@index < 30)    BEGIN        SET @year = 2005 + (@index %

Oracle Pivot简单用法

因为工作中经常需要excel或者报表输出,了解到pivot函数,查了部分资料,实在不够详尽,便想自己写一篇.pivot了解不深,只写写简单用法. table t{ c1,c2,c3,c4 } 有库表t,其中有字段c1,c2,c3,c4 select * from (select c1,c2,c3,c4 from t) pivot(func(c1) for c2 in (v1,v2,v3)) 其中func(c1)表示对c1使用func聚合函数 将输出的字段是c3,c4,v1,v2,v3,其中v1,