zoukankan      html  css  js  c++  java
  • sql不重复的查找统计数据(经典)

    例表如下:

    表名:MYTEST

    TID    COL1    COL2     COL3

    1           1           A            A
    2           1           A            A
    3           2           A            A
    4           2           B            A
    5           3           B            B
    6           3           B            B
    7           4           C            B
    8           4           C            B
    9           1           A            A
    10         2           B            A

    1查找表中的一个字段,重复的只找一个:

    SELECT DISTINCT COL1 FROM MYTEST;

    2查找表中的多个字段,其中某个字段不重复:

    SELECT * FROM MYTEST WHERE rowid IN (SELECT    min(rowid) FROM MYTEST GROUP BY COL1);

    重点:select * from 表 where 列ID in (select min(列id) from 表 group by 不想重复的列名)

    结果为:
    1           1           A            A
    3           2           A            A
    5           3           B            B
    7           4           C            B

    其中rowid为oracle中的虚拟column用来指向表中一个row的存放地址,改为其它的不能运行(这样理解不知对不对?哪位朋友有更好的理解请给我留言)

    min方法若改为max时结果如下:
    6          3          B          B
    8          4          C          B
    9          1          A          A
    10        2          B          A

    3查询并统计该字段的数量

    SELECT COL1,COUNT(COL1) FROM MYTEST GROUP BY COL1;

    结果为:
    1          3
    2          3
    3          2
    4          2

    GROUP BY 哪个字段只能查找哪个字段和该字段的数量若要同时搜索其它字段就报错
    即:
    语句若改成    SELECT COUNT(COL1) FROM MYTEST GROUP BY COL1;
    或    SELECT COL1,COL2,COUNT(COL1) FROM MYTEST GROUP BY COL1;就会报错

    原因可能是:搜索的结果是一组组的数据在每一组数据中,COL2有很多,所以不能搜索出唯一的一个值(这样理解不知对不对?哪位朋友有更好的理解请给我留言)

    4从两个表中查询并统计数据

    表T_OVERTIME字段
    int tid = 0;//加班代码
    float days = 0;//工日数

    表T_OVERTIMEPERSONNEL字段
    int tid = 0;//加班人员代码
    int overtimeid = 0;//加班代码
    int userid=0;//用户ID

    统计每个用户的加班工日数
    SELECT b.userid,SUM(a.days) FROM T_OVERTIME a,T_OVERTIMEPERSONNEL b WHERE a.tid=b.overtimeid GROUP BY b.userid

    5按多个字段分组并统计

    SELECT COL1, COL2, COUNT(*) AS Expr1
    FROM mytest
    GROUP BY COL1, COL2

    结果为:

    COL1    COL2    COUNT

         1           A           3
         2           A           1
         2          B           2
         3           B           2
         4           C           2
    即按COL1, COL2分组后COL1, COL2的内容和每组中记录的数量

    若:SELECT COL1, COL2, COUNT(DISTINCT COL3) AS Expr1
    FROM mytest
    GROUP BY COL1, COL2

    结果为:
    COL1    COL2    COUNT
         1           A           1
         2           A           1
         2          B           1
         3           B           1
         4           C           1
    若将第7条记录改为 7           4           C           C
    则结果为:
    COL1    COL2    COUNT
         1           A           1
         2           A           1
         2          B           1
         3           B           1
         4           C           2
    即按COL1, COL2分组后COL1, COL2的内容和每组中COL3不重复的记录数

    http://post.blog.hexun.com/wolffery/trackback.aspx?articleid=18946781&key=633458003799400000本文章尚未被引用

    例表如下:

    表名:MYTEST

    TID    COL1    COL2     COL3

    1           1           A            A
    2           1           A            A
    3           2           A            A
    4           2           B            A
    5           3           B            B
    6           3           B            B
    7           4           C            B
    8           4           C            B
    9           1           A            A
    10         2           B            A

    1查找表中的一个字段,重复的只找一个:

    SELECT DISTINCT COL1 FROM MYTEST;

    2查找表中的多个字段,其中某个字段不重复:

    SELECT * FROM MYTEST WHERE rowid IN (SELECT    min(rowid) FROM MYTEST GROUP BY COL1);

    结果为:
    1           1           A            A
    3           2           A            A
    5           3           B            B
    7           4           C            B

    其中rowid为oracle中的虚拟column用来指向表中一个row的存放地址,改为其它的不能运行(这样理解不知对不对?哪位朋友有更好的理解请给我留言)

    min方法若改为max时结果如下:
    6          3          B          B
    8          4          C          B
    9          1          A          A
    10        2          B          A

    3查询并统计该字段的数量

    SELECT COL1,COUNT(COL1) FROM MYTEST GROUP BY COL1;

    结果为:
    1          3
    2          3
    3          2
    4          2

    GROUP BY 哪个字段只能查找哪个字段和该字段的数量若要同时搜索其它字段就报错
    即:
    语句若改成    SELECT COUNT(COL1) FROM MYTEST GROUP BY COL1;
    或    SELECT COL1,COL2,COUNT(COL1) FROM MYTEST GROUP BY COL1;就会报错

    原因可能是:搜索的结果是一组组的数据在每一组数据中,COL2有很多,所以不能搜索出唯一的一个值(这样理解不知对不对?哪位朋友有更好的理解请给我留言)

    4从两个表中查询并统计数据

    表T_OVERTIME字段
    int tid = 0;//加班代码
    float days = 0;//工日数

    表T_OVERTIMEPERSONNEL字段
    int tid = 0;//加班人员代码
    int overtimeid = 0;//加班代码
    int userid=0;//用户ID

    统计每个用户的加班工日数
    SELECT b.userid,SUM(a.days) FROM T_OVERTIME a,T_OVERTIMEPERSONNEL b WHERE a.tid=b.overtimeid GROUP BY b.userid

    5按多个字段分组并统计

    SELECT COL1, COL2, COUNT(*) AS Expr1
    FROM mytest
    GROUP BY COL1, COL2

    结果为:

    COL1    COL2    COUNT

         1           A           3
         2           A           1
         2          B           2
         3           B           2
         4           C           2
    即按COL1, COL2分组后COL1, COL2的内容和每组中记录的数量

    若:SELECT COL1, COL2, COUNT(DISTINCT COL3) AS Expr1
    FROM mytest
    GROUP BY COL1, COL2

    结果为:
    COL1    COL2    COUNT
         1           A           1
         2           A           1
         2          B           1
         3           B           1
         4           C           1
    若将第7条记录改为 7           4           C           C
    则结果为:
    COL1    COL2    COUNT
         1           A           1
         2           A           1
         2          B           1
         3           B           1
         4           C           2
    即按COL1, COL2分组后COL1, COL2的内容和每组中COL3不重复的记录数

  • 相关阅读:
    Java母牛繁殖问题
    【转】区块链交易的并发执行
    Cinder 架构分析、高可用部署与核心功能解析
    【转】区块链的隐私保护方案介绍
    如何在ES6中判断类中是否包含某个属性和方法
    阿里云MySQL及Redis灵异断连现象:安全组静默丢包解决方法
    如何区别ES5和ES6创建类(异同点)
    这两家独角兽企业在强敌缠斗中崛起
    来看一看那些已经倒闭的互联网公司
    《并行计算的编程模型》一3.6.1 全局同步屏障
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416308.html
Copyright © 2011-2022 走看看