distinct多个字段汇总 oracle_distinct oracle 多个字段 - CSDN
精华内容
参与话题
  • Oracle去重后再进行count()计数

    万次阅读 2019-03-19 14:43:05
    sum()是基于分组,也就是说有sum()的SQL语句中必须要有group by关键字,而count()可不必基于分组,二者在大多数情况下用以实现计数,但不同于count()的是,sum()内的字段必须要为number类型,常用于金额等数据的汇.....

    一般地:有意义的计数首先都需要去除重复,然后再进行count()计数!

    这个时候就去重的逻辑就显得尤为重要!

    一、首先说说我个人对以下两个函数的理解

    sum()是基于分组,也就是说有sum()的SQL语句中必须要有group by关键字,而count()可不必基于分组,二者在大多数情况下用以实现计数,但不同于count()的是,sum()内的字段必须要为number类型,常用于金额等数据的汇总。而count()则可以为varchar2类型的字段。用于统计以count()内的字段为列的总记录数。

    二、应用实例

    需求: 分别统计拥有份额的客户总数,以及客户下的机构、自然人的数量。

    前提条件:份额表记录客户的多条数据,但是有体现唯一客户的字段c_fundacco,单纯的使用count(a.c_fundacco)显然存在重复的问题。这个时候去重关键字distinct就显得尤为重要了!

    SQL语句实现:

    select count(distinct(a.c_fundacco)) f_sumcount, /*统计总人数是对唯一标识c_fundacco进行去重*/
    
           count(distinct decode(b.c_custtype, '0', a.c_fundacco, null)) f_orgcount,/*统计机构时先以客户类型decode归类,再进行去重计数*/
    
           count(distinct decode(b.c_custtype, '1', a.c_fundacco, null)) f_percount/*类似机构*/
    
      from  tshares a,
    
            tclientinfo b
    
     where  a.c_clientinfoid = b.c_clientinfoid

     

    展开全文
  • Oracle——常用统计汇总分析

    千次阅读 2018-08-06 09:46:49
    求指定列的平均值,如果求多个列的平均值需要多个avg() 实例: select avg(t.c1) from hjj t where t.name='SD.MY'; 指的是在hjj这个表当中当name字段等于'SD.MY'时,c1列的平均值  2.count() 统计指定列的...

    1.avg()

    求平均值

    求指定列的平均值,如果求多个列的平均值需要多个avg()

    实例:

    select avg(t.c1) from hjj t where t.name='SD.MY';

    指的是在hjj这个表当中当name字段等于'SD.MY'时,c1列的平均值 

    2.count()

    统计指定列的行数

    实例:

    select count(*),count(t.c1) from hjj t where t.name='SD.MY';

     在上句当中,假如一个表当中,即使表中的c1列有为空的部分,则利用count(*)也会将所有的列的数量统计出来,包含了空的部分,但是如果用count(c1)的话,只会将c1有值的部分统计出来。

    3.max()、min()

    求最大值、最小值

    实例:

    select max(t.c1),min(t.c1)from hjj t;
    

    提取出c1列中的最大值 、最小值

    4.sum()

    求一列的和

    实例:

    select sum(t.c1) from hjj t;
    

    5.wm_concat()

    转字符合并

    ①把以下图中Name一样的数据合并为一条,而且NO的值要这样显示如 C.1,C.2

    ②实现这种效果的操作如下,先把Name的值进行分组(group by),再把NO的值用 wm_concat()函数合并起来(注意:记得要to_char(),要不然数据显示不出来,而且会显示成<CLOB>)

    实例:

    select t.name,to_char(wm_concat(distinct(t.nos))) from hjj_wm_concat group by t.name;
    安全管理 c1,c2,c5
    文明施工 c3,c4

     

    6.distinct()

    去重函数,在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。

    可用于单列去重

    select distinct name from A

    可多列去重

      select  distinct name,id from A

    例如:

    根据第三个表格可以理解为是name 和id两个字段共同作用的结果,可以理解为唯一映射

    7.group by rollup()

    Oracle group by高级用法对比效果(ROLLUP、GROUPING SETS、CUBE),今天主要跟大家演示一下,在同一组数据的情况下,每个SQL的执行结果。

         ①:普通的group by

           

     

           ②:加上ROLLUP

          

            ③:加上CUBE

          

         ④:加上GROUPING SETS

         

           总结如下:

    ROLLUP

    GROUP BY ROLLUP(A,B,C)

    首先对(A,B,C)进行GROUP BY,然后对(A,B)进行GROUP BY,然后是(A)进行GROUP BY, 最后对全表进行GROUP BY操作

    CUBE

    GROUP BY

     CUBE(A,B,C)

    首先对(A,B,C)进行GROUP BY,然后依次对(A,B)、(A,C)、(A)、(B,C)、(B)、(C)进行GROUP BY,最后对全表进行GROUP BY操作。

    GROUPING SETS

    GROUP BY 

    GROUPING SETS(A,B,C)

    依次对(C)、(B)、(A)进行GROUP BY。

    另外,在SQL中可以直接用加减乘除语句进行运算

    展开全文
  • CASE WHEN v.calltype='1' THEN COUNT(DISTINCT v.callid) END num, CASE WHEN v.isworktime='0' THEN COUNT(DISTINCT v.callid) END num1, CASE WHEN v.isworktime='1' THEN COUNT(DISTINCT v.callid) END num2,...
  • oracle数据去重方法汇总

    千次阅读 2019-04-05 22:33:26
    oracle去重:综合了别人的记录,大致有以下两种看起来顺眼。但速度如何,暂没时间验证。 1.delete from t where rowid not in (select min(rowid) from t group by 去重字段); 2.(注意:distinct是记录完全一致的...

    oracle去重:综合了别人的记录,大致有以下两种看起来顺眼。但速度如何,暂没时间验证。

    1.delete from t
    where rowid not in (select min(rowid) from t group by 去重字段);

    2.(注意:distinct是记录完全一致的重复。而上面是以某一列的值是否重复来决定)
    insert into 临时表 select distinct mobile from 原表;
    drop table 原表;
    rename 临时表名 to 原表名;

    根据原评论,第二种方法经常用在数据迁移等方面,如有此需求,可以验证。

    *****************************

     


    一、对于部分字段重复数据的删除
    先来谈谈如何查询重复的数据吧。
    下面语句可以查询出那些数据是重复的:
    select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
    将上面的>号改为=号就可以查询出没有重复的数据了。
    想要删除这些重复的数据,可以使用下面语句进行删除
    delete from 表名 a where 字段1,字段2 in
    (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
    上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:
    CREATE TABLE 临时表 AS
    (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
    上面这句话就是建立了临时表,并将查询到的数据插入其中。
    下面就可以进行这样的删除操作了:
    delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);
    这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

    这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。
    在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,
    我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。
    下面是查询重复数据的一个例子:
    select a.rowid,a.* from 表名 a
    where a.rowid !=
    (
    select max(b.rowid) from 表名 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2
    )
    下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。
    而外面就是查询出除了rowid最大之外的其他重复的数据了。
    由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
    delete from 表名 a
    where a.rowid !=
    (
    select max(b.rowid) from 表名 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2
    )

    随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
    create table 临时表 as
    select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
    delete from 表名 a
    where a.rowid !=
    (
    select b.dataid from 临时表 b
    where a.字段1 = b.字段1 and
    a.字段2 = b.字段2
    );
    commit;

    二、对于完全重复记录的删除

    对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
    select distinct * from 表名
    可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
    CREATE TABLE 临时表 AS (select distinct * from 表名);
    drop table 正式表;
    insert into 正式表 (select * from 临时表);
    drop table 临时表;

    如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从
    临时表将数据导入正式表中,如下:
    INSERT INTO t_table_bak
    select distinct * from t_table;

     

    本文转自:http://blog.163.com/k_doll/blog/static/7845013020091361626770/

    展开全文
  • oracle 分组求和一小例子

    万次阅读 2015-04-12 11:50:05
    2015年4月9日 天气冷表gw_log设计如下:Name Type Nullable Default Comments ------------ ------------- -------- ------- ---------- ID VARCHAR2(50) 消息id SERVICE_ID

    2015年4月9日 天气冷

    表gw_log设计如下:
    Name         Type          Nullable Default Comments   
    ------------ ------------- -------- ------- ---------- 
    ID           VARCHAR2(50)                   消息id     
    SERVICE_ID   VARCHAR2(20)  Y                服务ID     
    REQ_TIME     DATE          Y                请求时间   
    INVOKE_TIME  DATE          Y                调用时间   
    STATUS       CHAR(1)       Y        '0'     0:失败,1:成功 
    RESP_TIME    DATE          Y                响应时间   
    USER_NAME    VARCHAR2(20)  Y                用户名     
    SERVICE_TIME DATE          Y                调用服务结束时间 
    DESCN        VARCHAR2(256) Y                 描述 

    统计每天验证通过及不通过的总记录数:

    成功的sql语句:
    --方式1
    select req_time,
           sum(decode(status, '0', 1, 0)) fail,
           sum(decode(status, '1', 1, 0)) success
      from gw_log
     group by req_time;

    执行结果如下:
    这里写图片描述
    当然,用了decode()函数,那也可以用case函数了。

    失败的sql语句:
     --方式2
     select distinct a.req_time, a.fail, b.success
      from (select req_time,count(*) fail
              from gw_log
             where status = '0'
             group by req_time) a
            right join 
            (select req_time, count(*) success
              from gw_log
             where status = '1'
             group by req_time) b on a.req_time = b.req_time
    【参考:select * from  (select * from emp) e cross join   (select * from book) b】

    执行结果如下:
    这里写图片描述

    count 无记录未返回0, 因为有 group by 子句的.
    如果是不分组(即没有 Group By) 那是一定会返回一个 0 的.
    要让有 分组 的count返回 0 , 则需要使用外连接
    参考这篇文章可以解决问题!

    --方式3
     select *
        from (select a.req_time, count(*) success
                from gw_log a
               where a.status = '1'
               group by req_time
              union
              select b.req_time, count(*) fail
                from gw_log b
               where b.status = '0'
               group by b.req_time) g

    执行结果如下:
    这里写图片描述

    展开全文
  • Java 和算法汇总: 1.基本语法; 2.面向对象:类、对象、属性、方法、构造方法、封装、继承、多态、重写、重载、final、static、abstract、接口、抽象类; 3.常见的工具类:Object、String、StringBuilder...
  • oracle 表联合查询总结归纳

    万次阅读 多人点赞 2014-09-15 20:57:41
    本次预计讲解的知识点 ...在之前所使用的查询操作之中,都是从一张表之中查询出所需要的内容,那么如果现在一查询语句需要显示张表的数据,则就必须应用到表查询的操作,而表查询的语法如下:
  • Oracle Analyze

    千次阅读 2015-11-18 10:47:40
    Oracle Analyze
  • 今天工作中遇到的需求,要查出几个表中的数据,但是本着方便...union all,用于合并两个或多个select语句的结果集。需注意,列的数量必须相同,列名不必相同,列的类型也不必相同,如下: --建表 Create table T...
  • 在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:  1.查询全部字段的情况下,如"from 实体类",list中封装的对象为...2.只查询一个字段,默认情况下
  • jobs数比较的作业运行效率相对比较低,比如即使有几百行的表,如果次关联汇总,产生十几jobs,耗时很长。原因是map reduce作业初始化的时间是比较长的。 sum,count,max,min等UDAF,不怕数据倾斜问题,...
  • MySQL和Oracle的group by的异同

    千次阅读 2018-09-28 11:30:45
    MySQL和Oracle之间select的异同
  • Oracle 查询效率详解

    万次阅读 2011-08-30 07:35:14
    我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理...
  • Mysql与Oracle的50区别

    千次阅读 2016-07-21 18:07:19
    1. 有些人说Oracle没有限制,实际上他们说得可能是Oracle不支持LIMIT语法.不过可以rownum虚列来实现,不过会更加麻烦. ... 对于多个Master类型的系统,大部分用户都希望你使用更加复杂也更加昂贵的Oracl
  • Oracle入门手册

    千次阅读 2018-08-30 17:36:44
    Oracle基础操作手册 Oracle基础操作手册 查询系统当前时间 显示当前用户 查看表结构或列出函数、存储过程等的信息 Oracle中行称为记录,列称为字段。 注释 查找数据文件的存放位置、大小和状态。 distinct 去重 ...
  • 总结:Hive性能优化上的一些总结

    万次阅读 多人点赞 2017-08-07 01:04:18
    注意,本文百分之九十来源于此文:Hive性能优化,很感谢作者的细心整理,其中有些部分我做了补充和追加,要是有什么写的不对的地方,请留言赐教,谢谢前言 今天电话面试突然被涉及到hive上有没有做过什么优化,当时...
  • 将id相同的行数据合并起来

    千次阅读 2019-06-22 14:49:55
    在mysql中 转自:... MySQL中使用group_concat函数 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 1、基本查询 select * from aa; ...
  • SQL,在这里我理解成SQL Server。三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性。排行第四的DB2(属IBM公司),与Oracle的...Oracle:中文译作甲骨文,这是一家传奇的公司,有一传...
  • 数据库的优化-应付面试

    万次阅读 2016-05-09 23:07:49
    在数据仓库项目中,由于数据规模庞大,提高数据的查询效率是永恒的主题,常见的优化手段有: 1、 硬件优化,提高机器性能,增加硬件等; 2、 优化查询语句,将限定性强的where条件放前,用exists代替in操作等;...
  • Hive性能优化(全面)

    千次阅读 2018-11-02 10:12:21
    Hive性能优化(全面) ... 1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? ... 数据量大不是问题,数据... jobs数比较的作业运行效率相对比较低,比如即使有几百行的表,如果次关联...
1 2 3 4 5 ... 20
收藏数 3,973
精华内容 1,589
关键字:

distinct多个字段汇总 oracle