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

时间: 2025-01-20 15:02:50

sql不重复的查找统计数据(经典)的相关文章

SQL语句技巧:按月统计数据_MsSql

表结构如下: qty date ---------------------------------------------- 13 2005/01/17 15 2005/01/19 3 2005/01/25 105 2005/01/27 1 2005/01/31 352 2005/02/03 12 2005/02/04 255 2005/02/07 6 2005/02/18 1 2005/02/19 28 2005/02/21 1 2005/02/22 394 2005/02/23 359 20

SQL删除重复数据方法

原文:SQL删除重复数据方法 例如: id           name         value 1               a                 pp 2               a                 pp 3               b                 iii 4               b                 pp 5               b                 pp 6            

sql删除重复数据的详细方法_MsSql

一. 删除完全重复的记录 完全重复的数据,通常是由于没有设置主键/唯一键约束导致的.测试数据: 复制代码 代码如下: if OBJECT_ID('duplicate_all') is not nulldrop table duplicate_all GO create table duplicate_all ( c1 int, c2 int, c3 varchar(100) ) GO insert into duplicate_all select 1,100,'aaa' union allse

帮忙写一段sql,重复数据取时间最近的怎么写?

问题描述 帮忙写一段sql,重复数据取时间最近的怎么写? 表如下学号 姓名 成绩 时间1 小明 88 9-5 1 小明 80 9-4 1 小明 70 9-3 输出结果学号 姓名 成绩 时间 1 小明 88 9-5 要求不用top.order by做 解决方案 select * from 表名 where 时间列=(selct max(时间列) from 表名) 解决方案二: 人在不,你是需要找出表中有一样的数据 并且拿出时间最大的 还是只有这三条数据找最大的啊

sql 去除重复数据(多字段)

问题描述 sql 去除重复数据(多字段) 我现在有个表 表里面有ID No,Pass 然后根据No,Pass相同的数据,保留Max(ID)数据,删除其他,如何做? 我是这么做的,不知道行不行 delete Min(ID),CAST(No AS VARCHAR)+CAST(Pass AS VARCHAR) from Table group by No, Pass having count(*) > 1 解决方案 可以用distinct或者group by一下 解决方案二: 试一下 DELETE F

oracle sql语句统计数据写法

问题描述 oracle sql语句统计数据写法 有3张表,A表活动B表活动地区C表地区商家 A表关联B表,B表关联C表都是一对多,现在需返回活动名称,活动地区数,地区商家数 解决方案 SELECT A.活动名称COUNT(1)SUM(SELECT COUNT(1) FROM C WHERE A=B AND B=C) FROM A INNER JOIN B ON A=B GROUP BY A.活动名称 解决方案二: SELECT T1.活动 AS 活动名称 COUNT(T2.地区) AS 活动地区

sqlserver-求一个sql的触发器统计数据

问题描述 求一个sql的触发器统计数据 小弟最近在做个小项目,有三张表,部门表,办公室表,人员表,统计表,结构是部门下有多个办公室,每个办公室有自己的成员,我想实现个触发器,统计每个部门的人数,比如男的有多少,女的有多少,然后保存在统计表中,添加和删除用户的时候更新统计表 部门表dpartment:did,dname 办公室表office:oid,did,oname 用户表user:uid,oid,usex,uname 统计表 statistics:sid,did,man,women 解决方案

sql-MySql执行分页时查询统计数据量的Sql语句差别及性能

问题描述 MySql执行分页时查询统计数据量的Sql语句差别及性能 现在开发系统,涉及到了分页查询,在做的时候就在想,能不能自动把查询sql语句通过参数自动封装成能够统计查询语句不在分页条件下查询出的数据量有多大,例如一般做法是: 1.先根据拼接的sql语句进行查询:select * from ecs_goods where goods_type = 1 limit 1000, 10 2.再统计数量:select count(*) from ecs_goods where goods_type

sql 删除重复数据

sql 删除重复数据 本文章提供一款mysql删除重复数据,就是数据表中存在二条以上的重复数据,删除编号最小的一条信息. delete `borough_name` as a from fke_borough as a, ( select *,min(id) from fke_borough group by `borough_name` having count(1) > 1 ) as b  where a.`borough_name` = b.`borough_name` and a.id