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

上一篇:oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)


下一篇:Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装