zoukankan      html  css  js  c++  java
  • SQL 查询不重复数据

    sql不重复的查找统计数据
    2007-06-29 11:04
    例表如下:

    表名: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;

    结果为:
    1
    2
    3
    4

    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 COL2,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
    以上是在oracle数据库中测试的结果。在其它数据库中不知是否能运行。欢迎大家提供更好更通用的方法。

    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不重复的记录数。

    使用 DISTINCT 消除重复项
    DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行。如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。例如,如果在 titleauthor 中选择所有作者 ID 时未使用 DISTINCT,那么将会返回下列行(其中包括一些重复的行):

    USE pubs
    SELECT au_id
    FROM titleauthor

    下面是结果集:

    au_id       
    ----------- 
    172-32-1176 
    213-46-8915 
    213-46-8915 
    238-95-7766 
    267-41-2394 
    267-41-2394 
    274-80-9391 
    409-56-7008 
    427-17-2319 
    472-27-2349 
    486-29-1786 
    486-29-1786 
    648-92-1872 
    672-71-3249 
    712-45-1867 
    722-51-5454 
    724-80-9391 
    724-80-9391 
    756-30-7391 
    807-91-6654 
    846-92-7186 
    899-46-2035 
    899-46-2035 
    998-72-3567 
    998-72-3567 

  • 相关阅读:
    计划任务
    Crontab 定时任务格式参数
    Nginx 内核优化
    AC自动机
    Benelux Algorithm Programming Contest 2017(D)
    BAPC2017
    2018.9青岛网络预选赛(K)
    2018.9青岛网络预选赛
    2018.9青岛网络预选赛(A)
    2018.9青岛网络预选赛(C)
  • 原文地址:https://www.cnblogs.com/mybk2014/p/4180105.html
Copyright © 2011-2022 走看看