精华内容
下载资源
问答
  • oracle行转列函数pivot

    千次阅读 2019-04-16 19:25:43
    什么情形下需要使用行转列 对于同一类的事物下具有多个属性(属性是有限的),比如说学生选课,每一名可以选择多个课程,而且课程的数量也是有限重复的(对于不通学生选同一门科就相当于是课程重复)。比如说下面这样的...

    什么情形下需要使用行转列

    对于同一类的事物下具有多个属性(属性是有限的),比如说学生选课,每一名可以选择多个课程,而且课程的数量也是有限重复的(对于不通学生选同一门科就相当于是课程重复)。比如说下面这样的数据:

    姓名班级性别课程分数
    张三一班高等数学96
    张三一班复变函数78
    张三一班英语78
    李四二班英语98
    李四二班复变函数78
    李四二班微积分73

    可以看到姓名这一列相当于是一个大类,其中包含的属性课程是有限重复的(不需要循环)虽然每个人选择的课程不一定完全相同但是课程总数是有限的。

    使用行转列的函数pivot查询后出现如下的结果:

    SELECT * FROM STUDENT  PIVOT(MIN(S_SCORE) FOR S_COURSE IN ('高等数学', '复变函数', '英语', '微积分')) 
    

    在这里插入图片描述
    下面讲解pivot的语法以及用法:

    pivot基本语法格式

    SELECT * FROM TABLE_NAME PIVOT(PIVOT_CLAUSE, PIVOT_FOR_CLAUSE, PIVOT_IN_CLAUSE); 
    

    语法解释

    • PIVOT_CLAUSE里面是聚合函数
    • PIVOT_FOR_CLAUSE: for子句,后面接的字段是我们想要将其转换为列的字段
    • PIVOT_IN_CLAUSE:in子句,代表的是对指定的列进行过滤,只会将指定的行转换成列(这里需要注意的是将指定的行转换成列的意思不是说将原来for后面的字段为in里面的内容的行距转换成列,
      实际上即使for后面的字段得值不在in子句里面,也是会被转换,只是转换的结果中不会存在这一列而已)

    测试数据

    在这里插入图片描述
    上面的测试数据中可以看到code也是重复的,可以将code转换成行显示,

    SELECT * FROM TEST_TABLE PIVOT((MIN(PLAN_DATE) FOR CODE IN('0001' AS CODE_ONE, '0002' AS CODE_TWO)); 
    

    可以得到如下结果:
    在这里插入图片描述
    将上面测试数据中的第二条数据的分类改为分类3,得到如下的测试数据:
    在这里插入图片描述
    然后使用同样的转换语句:

    SELECT * FROM TEST_TABLE PIVOT((MIN(PLAN_DATE) FOR CODE IN('0001' AS CODE_ONE, '0002' AS CODE_TWO)); 
    

    发现此时的结果有三条。
    在这里插入图片描述
    所以转换的结果行数也是有规律的,比如我们上面查询的时候使用的是*,也就是查询所有的列,这样的化去除PIVOT_CLAUSEPIVOT_FOR_CLAUSE两个字段,然后再将其余所有字段分组查询,上面的例子中就是:

    select id, name, price, category from test_table group by id, name, price, category;
    

    这样得到的结果行数就是使用pivot后的行数。

    查询的结果不仅仅是in子句里面的行数

    上面使用pivot查询的时候in子句里面是包含了for子句后面对应字段的所有值,比如code的值有0001以及0002,在in里面也就使用了0001和0002,当我们只是使用其中一个比如0002时:

    SELECT * FROM test_table PIVOT(MIN(plan_date) FOR CODE IN ('0002' AS CODE_ONE));
    

    得到的结果如下:
    在这里插入图片描述

    查询结果中是有三条结果的,但是原来的数据中code的值为0002的只有两条,所以这里不要被误导了,这里in里面只有code为0002的不是说原来的数据里面只有code=0002的才需要转换,实际上转换的还是所有的行,只是转换出来的列是少了一个的

    in子句不能使用子查询

    上面的in子句里面的内容是固定的,如果在in里面想要使用子查询比如下面的sql:

    SELECT * FROM test_table PIVOT(MIN(plan_date) FOR CODE IN (select distinct code from test_table));
    

    使用这种方式是会报错的。在网上搜索的时候看到可以使用存储过程来实现in子句里面使用动态查询,下次再写咯。

    展开全文
  • 因为工作中经常需要excel或者报表输出,了解到pivot函数,查了部分资料,实在不够详尽,便想自己写一篇。pivot了解不深,只写写简单用法。 table t{ c1,c2,c3,c4 } 有库表t,其中有字段c1,c2,c3,c4 select * ...

    因为工作中经常需要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,v1,v3可以单独写别名。select * 可将*换成c3,c4,v1,v2,v3其中想要输出的值

    这条语句相当于创建了一个表t2

    table t2{

    v1,v2,v3,

    c3,c4}

    其中v1相当于select func(c1) from t group by c2,c3,c4 where c2 = v1,v2,v3同理,同时输出的c3、c4也是根据以上规则分组出来的结果显示。

    一下来看个实例:

    1 CREATE table PRODUCT 
    2 (
    3    ID                   NUMBER(10)           not null,
    4    PRODUCT_NAME         VARCHAR2(50),
    5    SELL_TIME            DATE,
    6    SELL_COUNT           NUMBER(10),
    7    constraint PK_PRODUCT primary key (ID)
    8 );

    插入如下数据:

     

    然后要做的是根据2018年各产品销售量给出各个月销售数量表

    执行以下sql:

     1 SELECT *
     2   FROM (SELECT A.PRODUCT_NAME, TO_CHAR(A.SELL_TIME,'mm') AS mon, A.SELL_COUNT FROM PRODUCT A WHERE TO_CHAR(A.SELL_TIME,'yyyy') = '2018')
     3 PIVOT(SUM(SELL_COUNT)
     4    FOR MON IN('01' M1,
     5               '02' M2,
     6               '03' M3,
     7               '04' M4,
     8               '05' M5,
     9               '06' M6,
    10               '07' M7,
    11               '08' M8,
    12               '09' M9,
    13               '10' M10,
    14               '11' M11,
    15               '12' M12));

    结果如下:

    转载于:https://www.cnblogs.com/SaltFishYe/p/10196083.html

    展开全文
  • 今天接到业务部门的一个需求,需要对同一公司的不同财务指标进行排序,需要用到oracle行转列函数unpivot。 财务报表的表结构为: 要实现业务部门的排序筛选功能,需要首先将行数据转为数据: 使用unpivot...

      今天接到业务部门的一个需求,需要对同一公司的不同财务指标进行排序,需要用到oracle的行转列函数unpivot。

    财务报表的表结构为:

    要实现业务部门的排序筛选功能,需要首先将行数据转为列数据:

    使用unpivot函数,实现如下

    with t4 as (select t3.COMPCODE,
           t3.ENDDATE,
           t3.CURFDS        as "货币资金",
           t3.TRADFINASSET  as "交易性金融资产",
           t3.NOTESRECE     as "应收票据",
           t3.PLAC          AS "拆出资金",
           T3.DERIFINAASSET AS "衍生金融资产",
           T3.ACCORECE      AS "应收账款",
           T3.PREP          AS "预付款项",
           T3.              PREMRECE AS "应收保费",
           T3.              REINRECE AS "应收分保账款",
           T3.              REINCONTRESE AS "应收分保合同准备金",
           T3.              INTERECE AS "应收利息",
           T3.              DIVIDRECE AS "应收股利",
           T3.              OTHERRECE AS "其他应收款",
           T3.              EXPOTAXREBARECE AS "应收出口退税",
           T3.              SUBSRECE AS "应收补贴款",
           T3.              MARGRECE AS "应收保证金",
           T3.              INTELRECE AS "内部应收款",
           T3.              PURCRESAASSET AS "买入返售金融资产",
           T3.              INVE AS "存货",
           T3.              ACCHELDFORS AS "划分为持有待售的资产",
           T3.              PREPEXPE AS "待摊费用",
           T3.              UNSEG AS "待处理流动资产损益",
           T3.              EXPINONCURRASSET AS "一年内到期的非流动资产",
           T3.              OTHERCURRASSE AS "其他流动资产",
           T3.              TOTCURRASSET AS "流动资产合计",
           T3.              LENDANDLOAN AS "发放贷款及垫款",
           T3.              AVAISELLASSE AS "可供出售金融资产",
           T3.              HOLDINVEDUE AS "持有至到期投资",
           T3.              LONGRECE AS "长期应收款",
           T3.              EQUIINVE AS "长期股权投资",
           T3.              OTHERLONGINVE AS "其他长期投资",
           T3.              INVEPROP AS "投资性房地产",
           T3.              FIXEDASSEIMMO AS "固定资产原值",
           T3.              ACCUDEPR AS "累计折旧",
           T3.              FIXEDASSENETW AS "固定资产净值",
           T3.              FIXEDASSEIMPA AS "固定资产减值准备",
           T3.              FIXEDASSENET AS "固定资产净额",
           T3.              CONSPROG AS "在建工程",
           T3.              ENGIMATE AS "工程物资",
           T3.              FIXEDASSECLEA AS "固定资产清理",
           T3.              PRODASSE AS "生产性生物资产",
           T3.              COMASSE AS "公益性生物资产",
           T3.              HYDRASSET AS "油气资产",
           T3.              INTAASSET AS "无形资产",
           T3.              DEVEEXPE AS "开发支出",
           T3.              GOODWILL AS "商誉",
           T3.              LOGPREPEXPE AS "长期待摊费用",
           T3.              TRADSHARTRAD AS "股权分置流通权",
           T3.              DEFETAXASSET AS "递延所得税资产",
           T3.              OTHERNONCASSE AS "其他非流动资产"
      from TQ_FIN_PROBALSHEETNEW t3)
      select COMPCODE , ENDDATE, zhibiao, jine from t4 unpivot (jine for zhibiao in ("应收保费",                
    "应收分保账款",            
    "应收分保合同准备金",  
    "应收利息",                
    "应收股利",                
    "其他应收款",              
    "应收出口退税",      
    "应收补贴款",              
    "应收保证金",              
    "内部应收款",
    "买入返售金融资产",           
    "存货",                               
    "划分为持有待售的资产",         
    "待摊费用",                       
    "待处理流动资产损益",                 
    "一年内到期的非流动资产", 
    "其他流动资产",               
    "流动资产合计",               
    "发放贷款及垫款",               
    "可供出售金融资产",           
    "持有至到期投资"    ,           
    "长期应收款"          ,           
    "长期股权投资"        ,           
    "其他长期投资"    ,           
    "投资性房地产"        ,           
    "固定资产原值"    ,           
    "累计折旧"            ,           
    "固定资产净值"    ,           
    "固定资产减值准备",           
    "固定资产净额"    ,           
    "在建工程"            ,           
    "工程物资"            ,           
    "固定资产清理"    ,           
    "生产性生物资产"      ,           
    "公益性生物资产"        ,           
    "油气资产"            ,           
    "无形资产"            ,           
    "开发支出"            ,           
    "商誉"                ,           
    "长期待摊费用"      ,           
    "股权分置流通权"  ,           
    "递延所得税资产"  ,           
    "其他非流动资产" 
    ) )
    

      

    转载于:https://www.cnblogs.com/matrixworld/p/5476781.html

    展开全文
  • oracle 行转列 使用pivot函数 首先看下面的效果 由上面的表转变为下面的表 首先建一个原始表,并插入测试数据,代码如下 create table SALE2 ( 月份 VARCHAR2(20), 销售量 VARCHAR2(20) ); insert into sale ...

    oracle 行转列 使用pivot函数

    • 首先看下面的效果

    在这里插入图片描述
    由上面的表转变为下面的表
    在这里插入图片描述

    首先建一个原始表,并插入测试数据,代码如下

    create table SALE2
    (
      月份  VARCHAR2(20),
      销售量 VARCHAR2(20)
    );
    insert into sale
      select '一月份' 月份, '1' 销售量
        from dual
      union
      select '二月份' 月份, '2' 销售量
        from dual
      union
      select '三月份' 月份, '3' 销售量
        from dual
      union
      select '四月份' 月份, '4' 销售量
        from dual
      union
      select '五月份' 月份, '5' 销售量
        from dual;
    commit;
    

    然后使用下面的这段代码就可以行转列了(使用pivot函数)

    select *
      from a
    pivot (sum(销售量) for 月份 
    			in('一月份' 一月份,
                   '二月份' 二月份,
                   '三月份' 三月份,
                   '四月份' 四月份,
                   '五月份' 五月份));
    
    展开全文
  • pivot函数行转列函数:  语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值));unpivot函数转行函数:  语法:unpivot(新增值所在的列名 for 新增转为行后所在的列名 in (需转为行...
  • Oracle 行转列 pivot函数基本用法

    万次阅读 多人点赞 2018-09-30 23:28:05
    2018年9月30日22点,眼看着就10月份了,回头看下,8月份就写了一...所以暂时先写个Oracle自带的行转列函数pivot的基本用法。国庆几天看下有时间的话完善一下动态转的做法,到时候再另写一篇附链接过来。 一、运...
  • pivot函数行转列函数:  语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值));unpivot函数转行函数:  语法:unpivot(新增值所在的列名 for 新增转为行后所在的列名 in (需转为行...
  • Oracle行转列pivot

    2013-03-15 20:45:13
    oracle数据库最详细的行转列资料,是官方文档的详细介绍版,中文的
  • oracle行转列 pivot函数

    2021-03-08 15:58:07
    前段时间项目做一个报表,需要将行转,在网上搜索学习一波后完成了项目任务。现在回顾做个笔记,留待后续回顾 见了一张测试表如下(随便记载一下,就没设主键啥的了) 随便插一些数据 SELECT * FROM T_M_Z_...
  • 1.根据分类 select code, proname, amt_jbgz, ...from bgt_extable pivot ( sum(nvl(金额,0)) for 分类字段 in( ...2.添加后缀(多个行转列) select code, proname, amt_jbgz_shb, amt...
  • Oracle函数篇 - pivot行转列函数

    千次阅读 2019-12-19 16:30:24
    SELECT 语句pivot_clause允许您编写交叉表位查询,将旋转到中,在旋转过程中聚合数据。透视是数据仓库中的一项关键技术。在其中,您将多行输入转换为数据仓库中更少且通常更宽的。透视时,将针对数据透视值...
  • 执行结果: 使用PIVOT函数: SELECT T1.*,T1.语文+T1.数学+T1.英语+T1.物理 AS 总计 FROM ( SELECT * FROM CC PIVOT ( MAX(SCORE) FOR COURSE IN ('语文' AS 语文 , '数学' AS 数学, '英语' AS 英语,'物理' AS 物理) ...
  • HH 终风且暴,顾我则笑,谑浪笑敖,中心是悼。 终风且霾,惠然肯来,莫往莫来,悠悠我思。 博客园 首页 ...Oracle行转列转行的Sql语句总结 多行转字符串 这个比较简单,用||或concat函数...
  • Oracle SQL函数pivot、unpivot转置函数实现行转列转行
  • 最近工作中,需要将数据行转列,在网上找了一下,发现Oracle11有个函数pivot可以直接行转列,很是方便,减少了SQL的代码量。下面仅记载自己的用法总结。 oracle 官方的解释 ...
  • oracle行转列函数

    2018-03-08 11:30:14
    PIVOT行转列 语法 SELECT .... FROM <table-expr> PIVOT ( aggregate-function(<column>) FOR <pivot-column> IN (<value1>, <value2...
  • 可以查看博客园上传的文件 ... pivot 除了要的字段(classnum,classid)值不一样,其他值都应该相同,否则的数据有问题 转载于:https://www.cnblogs.com/wlzhang/p/5057271.html...
  • 转行函数:decode、pivot 要求:将图1转换成图2格式 创表语句: create table score( cno varchar2(10), sno varchar2(10), dr number ); 插入数据: insert into score values (‘c001’,‘s003’,1); insert ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,407
精华内容 962
关键字:

oracle行转列函数pivot