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

  • 相关阅读:
    [LeetCode] 336. Palindrome Pairs
    [LeetCode] 214. Shortest Palindrome
    [LeetCode] 844. Backspace String Compare
    [LeetCode] 5. Longest Palindromic Substring
    [LeetCode] 269. Alien Dictionary
    [LeetCode] 200. Number of Islands
    [LeetCode] 72. Edit Distance
    [LeetCode] 460. LFU Cache
    [LeetCode] 1229. Meeting Scheduler
    [LeetCode] 22. Generate Parentheses
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416308.html
Copyright © 2020-2023  润新知