从上个星期起就在开始做统计图,各种统计图,昨天做的统计效果图如下:

      在这里要根据工作平台和机构做统计,其中当字段A等于某个值时需要统计起来,也就是说假设等于2时需要做统计,字段B和字段C为在数据库中为某个字段ZT的某种状态统计值,就是说当ZT==”1”时统计到字段B中,否则统计到字段C中。

      对于这个我一开始想到的是查询出全部数据,然后在java代码中做逻辑判断,但是这样的效率太低了,如果数据量一大,那么处理的速度会有影响。

于是我开始考虑使用函数,觉得函数应该可以解决问题,而且效率还可以。所以决定使用函数来实现。但是在编写函数的过程中,这个函数还真不是一般的复杂。处理过程如下:

      首先我们需要建立一个type,将查询的结果集放入type中。

CREATE OR REPLACE TYPE type_wlzh as   object
(
gzmb varchar2(200), --工作平台
czdwdm varchar(100), --机构
accountSum varchar(100), --总量
jpAccountSum varchar(100), --字段A
yxAccountSum varchar(100), --字段B
wxAccountSum varchar(100) --字段C
)

      然后建立函数Function。在这个函数的建立中需要处理连接四块

      1、 最左边部分,也就是最根本的统计元素:工作平台、机构。、

select t.gzmb,t.czdwdm from t_xtgl_account t
group by t.gzmb,t.czdwdm

      2、 然后开始统计字段C,并将其union到前面一部分

(select t.gzmb,t.czdwdm from t_xtgl_account t
group by t.gzmb,t.czdwdm) wlzh
union
(select t.gzmb,t.czdwdm ,count(*) jpAccountSum from t_xtgl_account t
where t.account_lx = '2'
group by t.gzmb,t.czdwdm,t.account_lx) jpsl
on wlzh.gzmb = jpsl.gzmb and wlzh.czdwdm = jpsl.czdwdm

      3、 重复字段B、字段C

      4、 最后循环这个部分,将其赋值到新建的type中去,最后返回type。

      看到这个过程,你是不是头晕了?不管你晕没晕,反正我是晕了。正当我在哪里想有没有什么更好的解决办法时,陈老板(部门技术总监)从我身边经过, 到我这个比较多的Function时,问我怎么写出了这么复杂的function,于是我就将需求将给他听,人家直接丢一句话:靠,这么简单的,你竟然用函数,吃多了没事干吧。于是敲起来,不到一分钟搞定,结果完全是我想要的。

select t.gzmb,t.czdwdm ,count(*) accountSum,
sum(decode(t.account_lx,'5AD391F6E23C2BC9836337E6C51E28D2',1,0)) jpAccountSum,
sum(decode(t.accountisyx,'D588249D3081C4028646D7AAE432B506',1,0)) yxAccountSum
from t_xtgl_account t
group by t.gzmb,t.czdwdm

      这里由于数据是加密的,所以对于状态的选择只能是密文了。

      在这里我们需要对decode函数有一定的了解。其实对于decode我们可以认为是一个简单的if-then-else语句。语法如下:

      DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )

      Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。

select t.id,t.name,decode(t.sex,'1','男','2','女','人妖')
from person t

     对于上面的SQL语句,当sex==1时,输出男,==2时输出女,否则输出人妖。

      所以对于上面的统计求和:sum(decode(t.account_lx,'5AD391F6E23C2BC9836337E6C51E28D2',1,0))就很好分析了,如果account_lx==5AD391F6E23C2BC9836337E6C51E28D2那么等于1,否则等于0,当等于1是就会增加1,等于0时就会加0,这样就实现统计了。

使用decode函数实现统计的更多相关文章

  1. ORACLE的sign函数和DECODE函数

    比较大小函数 sign 函数语法:sign(n) 函数说明:取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 示例:一.select sign( 100 ),sign(- 100 ),sig ...

  2. Oracle DECODE函数的语法介绍

    Oracle DECODE函数功能很强,下面就为您详细介绍Oracle DECODE函数的用法,希望可以让您对Oracle DECODE函数有更多的了解. Oracle DECODE函数 Oracle ...

  3. 转载-Oracle ORACLE的sign函数和DECODE函数

    原文地址:http://www.cnblogs.com/BetterWF/archive/2012/06/12/2545829.html 转载以备用 比较大小函数 sign 函数语法:sign(n) ...

  4. SQL行转列:decode函数

    前言 开发中我们经常会用到行转列,这里记录一下我在项目中实现行转列的思路.需求:报表模块,统计某机房机架的不同状态(1 空闲  2 预占  3 占用)的数量(真实需求更为复杂,这里只是讨论技术,简化一 ...

  5. [Oracle] decode 函数及其用法

    http://blog.csdn.net/oscar999/article/details/18399177 前言 DECODE()函数,它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值 ...

  6. 今天的一个SQL题-case语句和decode函数

    数据库表: select * from rec order by rst,game_time; ID GAME_TIME      RST ------ -------------- ---- 2 0 ...

  7. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  8. decode()函数

    decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,.. ...

  9. oracle的decode函数在mysql的实现

    oracle中的decode函数很好用,换成mysql中可以用类似下面的方法实现: SELECT IF(TRUE, '真值', '假值'); 如果想再弄复杂点,可以多个IF嵌套,不过嵌套的层次多了,代 ...

随机推荐

  1. jquery 判断checkbox是否选中几个版本的区别

    $('#checkbox1').prop('checked') - in jQuery 1.6+, usually the way to go $('#checkbox1').is(':checked ...

  2. (python)对象的引用

    对比下列两个例子: 例子1: a=10 b=a a=a+2 print "a=",a,"b=",b 结果:a= 12 b= 10 a+2后,b仍然是10 例子2 ...

  3. 在rails中 Rendering Partials through Ajax

    之前做.net的时候,自己做了一个showcontent的插件,用来加载页面的局部partial 之前采用的是ashx的方式 但rails里面不太方面,今天找到一个比较好的方法,试验成功 起初网上找到 ...

  4. SpringMVC常用注解實例詳解1:@Controller,@RequestMapping,@RequestParam,@PathVariable

    我的開發環境 框架:        springmvc+spring+freemarker 開發工具: springsource-tool-suite-2.9.0 JDK版本: 1.6.0_29 to ...

  5. 解决Ubuntu下Chrome浏览器网页中文字体混乱

    在Ubuntu下使用Chrome浏览器时碰到了网页中文字体混乱的现象: 黑体和楷体混杂,看起来非常不美观. 这是由于许多网页并没有指定字体,然后浏览器将调用系统默认字体配置. 首先,安装文泉驿字体: ...

  6. java-7311练习(上)

    java练习,仅供参考! 欢迎同学们交流讨论. JDK 1.8 API帮助文档 JDK 1.6 API中文文档 Java GUI -------------------------2016-10-23 ...

  7. MATLAB不运行也不报错

    今天本来挺激动找到能运行的好几个程序 MATLAB忙到busy也是停不下来 本来不以为然 结果呢 吃了个水果 一杯水都喝下去了 还没结果(⊙o⊙) 这时候解决办法只有一个 Ctrl+c

  8. 一个字体引发的bug

    delphi 7 中默认字体样式为‘MS Sans Serif’,一般情况下子级控件会继承父级一些属性,其中包括字体(包括字体大小,字体样式,颜色等)属性.如果动态创建控件且需要修改字体颜色或者大小时 ...

  9. PHP——使用header()函数下载文件

    思路:先指明内容的MIME类型,内容描述,内容长度(也即文件大小). 一.下载txt文件的程序: <?phpheader('Content-Type:text/plain');header('C ...

  10. CSS中继承,特殊性,层叠与重要性

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: <html><head> ...