Oracle行转列 参数动态传入iBatis使用示例

最近做了一个需求,需要获取工作流数据的各个节点的渠道数量信息,各渠道的费用信息~

之前的需求是只需要获取渠道数据,所以做了渠道兼容,每个渠道数量的获取都是先case when 处理,然后再sum统计的

方案一:手动汇总数据为列数据(先case when 计算再sum统计)

例如:   #统计渠道数据量:渠道代码相同时,渠道数据计数1,不同时计数0

select
taskname
, case when t.CHANNEL_CODE = #channelcode0# then 1 else 0 end channel0
, case when t.CHANNEL_CODE = #channelcode1# then 1 else 0 end channel1
from tablename ;

  

完整的统计sql

select
tb.taskname
,sum(tb.channel0) channel0num
,sum(tb.channel1) channel1num
from (
  select
    taskname
    , case when t.CHANNEL_CODE = #channelcode0# then 1 else 0 end channel0
    , case when t.CHANNEL_CODE = #channelcode1# then 1 else 0 end channel1
  from tablename
)tb group by taskname 

执行效果图如下:

方案二:使用oracle的列转行函数

接下来我们看看强大的Oracle如何教我们行列转置,免得那么麻烦的去case when 再 sum了

 关键函数 pivot  (列转为行) 

在表名后面接以下这段 pivot( sum(colum_name) alisname for key_column  in (value1 name1, value2 name2))

 colum_name #需要统计的数据信息(渠道数据或者保费信息),这里需要用聚合函数

 alisname  #这个数据项的别名

 key_column #关键列,就是将此列数据转换为行

 value1:  key_column的可能值,这里如果是固定值可以直接写,在代码里面也可以用变量代替

 name1:  value1对应的别名,最后生成的数据名称会自动拼接为  name1_alisname  (例如如下的 ch0_cnt )

使用示例:

select
TASK_NAME
,sum(ch0_cnt) as channel0num
,sum(ch1_cnt) as channel1num
from tablename t pivot(count(CHANNEL_CODE) cnt for CHANNEL_CODE in (1 ch0, 21 ch1))
group by TASK_NAME

  

执行效果:(与方案一 殊途同归,但是这个会简洁很多,尤其是当渠道信息多的时候就会简洁的更明显了啦~)

行转列的时候统计多项数据:(可以写多个聚合函数,但是统计的中心列只有一项哦 以下示例均以 CHANNEL_CODE 渠道为中心,来统计各项数据)

select
TASK_NAME
,sum(ch0_cnt) as channel0num
,sum(ch1_cnt) as channel1num
,sum(ch0_daycount) as ch0_daycount
,sum(ch1_daycount) as ch1_daycount
from ReportNBUWData t pivot( sum(PASSED_TIME) daycount, count(CHANNEL_CODE) cnt for CHANNEL_CODE in (1 ch0, 21 ch1))
group by TASK_NAME

  

 方案三:ibatis使用动态变量

变量格式:<![CDATA[$channelcode0$]]>  ,其中 channelcode0 为变量名

千万要记得获取的变量的时候用 $parameter$ ,且要使用 <![CDATA[ ]]> 文本化

例如:

select
TASK_NAME
,sum(ch0_cnt) as channel0num
,sum(ch1_cnt) as channel1num
,sum(ch0_daycount) as ch0_daycount
,sum(ch1_daycount) as ch1_daycount
from ReportNBUWData t pivot( sum(PASSED_TIME) daycount, count(CHANNEL_CODE) cnt for CHANNEL_CODE in (<![CDATA[$channelcode0$]]> ch0,<![CDATA[$channelcode1$]]> ch1))
group by TASK_NAME

  

如果有多个变量参数,可以按照如下格式继续添加 : <![CDATA[$channelcode0$]]> ch0

需要注意的点:

1.入参不可以为空!!! 入参不可以为空!!!  一定要有具体的值!!!  意思就是 $channelcode0$ 变量对应的值不可以为空,也不可以为null!!!

2.要使用 <![CDATA[ ]]> 文本化  (否则就报错:pivot内不能使用动态变量)

3.不可以使用预编译 #channelcode0#,要使用 $channelcode0$!!! (否则就报错:pivot内不能使用动态变量)

参考博客:https://www.bbsmax.com/A/WpdK4oZnzV/ (oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式)

Oracle列转行 参数动态传入iBatis使用示例的更多相关文章

  1. Oracle列转行函数Listagg以及pivot查询示例

    简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...

  2. Oracle列转行函数版本不兼容解决方案

    业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不 ...

  3. Oracle列转行函数LISTAGG()

    --Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...

  4. Oracle列转行函数使用

    一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...

  5. oracle列转行

    unpivot()函数需要Oracle版本大于等于11g --创建表 create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 in ...

  6. Oracle 列转行函数 Listagg()

    这是最基础的用法: LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX) 例: select listagg(oeid,',') within GROUP (ord ...

  7. oracle 列转行

    with temp as( as S3 from dual union all as S3 from dual ) select * from temp unpivot(Qty for Sizes i ...

  8. oracle列转行 WM_CONCAT LISTAGG

    开发给个SQL说给某个条件时报ORA-22922 代码段: SELECT 袋号, SUM(实际重量) AS 实际重量, SUM(材积重量) AS 材积重量, COUNT(运单号) AS 件数, TO_ ...

  9. oracle 行转列、列转行

    最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...

随机推荐

  1. 团队项目-Beta冲刺(第一周)

    团队项目-Beta冲刺(第一周) 一. 作业描述 这个作业属于哪个课程 这个作业要求在哪里 团队名称 CTRL-IKun 这个作业的目标 合理安排时间完成接下来的任务,剩余任务预估,分配任务(开发,测 ...

  2. ES6笔记分享 part 1

    ECMAScript ES6 从一脸懵逼到灵活运用 var let const var let const 的比较 声明与赋值 var声明的变量是可以重新赋值的,也可以重复声明 let和const声明 ...

  3. SpringCloud与微服务Ⅹ --- SpringCloud Config分布式配置中心

    一.SpringCloud Config是什么 分布式系统面临的问题 --- 配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个 ...

  4. python+selenium爬取百度文库不能下载的word文档

    有些时候我们需要用到百度文库的某些文章时,却发现需要会员才能下载,很难受,其实我们可以通过爬虫的方式来获取到我们所需要的文本. 工具:python3.7+selenium+任意一款编辑器 前期准备:可 ...

  5. 三、Linux系统中的文件类型和文件扩展名

    .sock文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行通信: linux中的文件类型 文件类型介绍 Linux系 ...

  6. 04讲基础篇:经常说的CPU上下文切换是什么意思(下)

    具体分析 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题: 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈: 中断次数 ...

  7. Codeforces_734_E

    http://codeforces.com/problemset/problem/734/E 每次操作可以把连通的同颜色的点全部换颜色,缩点,找直径,第一遍dfs找起点,第二遍dfs求直径. #inc ...

  8. HDU 5558 Alice's Classified Message(后缀数组+二分+rmq(+线段树?))

    题意 大概就是给你一个串,对于每个\(i\),在\([1,i-1]\)中找到一个\(j\),使得\(lcp(i,j)\)最长,若有多个最大\(j\)选最小,求\(j\)和这个\(lcp\)长度 思路 ...

  9. Head First设计模式分析学习

    永不放弃的毅力,和对欲望的控制. 注意:要能够理解相类似的设计模式之间的区别和不同.可以把类比列举出来,加深记忆. 是否加入Spring容器中的标准是是否要用到Spring框架的方法或者功能特性,如事 ...

  10. python机器学习——正则化

    我们在训练的时候经常会遇到这两种情况: 1.模型在训练集上误差很大. 2.模型在训练集上误差很小,表现不错,但是在测试集上的误差很大 我们先来分析一下这两个问题: 对于第一个问题,明显就是没有训练好, ...