您的位置:首页 > 数据库

sql不重复的查找统计数据

2008-03-13 11:16 330 查看
例表如下:

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

(25 row(s) affected)

而使用了 DISTINCT 后,就能够除去重复项,而只查看唯一的作者 ID:

USE pubs
SELECT DISTINCT au_id
FROM titleauthor

下面是结果集:

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

(19 row(s) affected)

这是SQL的说明,但是只要表中如果存在Text、ntext、image类型字段时,需要进行查询时,就会出现“不能以DISTINCT方式选择Text、ntext、image数据类型”
不知道怎么去解决这个问题?
使用 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

(25 row(s) affected)

而使用了 DISTINCT 后,就能够除去重复项,而只查看唯一的作者 ID:

USE pubs
SELECT DISTINCT au_id
FROM titleauthor

下面是结果集:

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

(19 row(s) affected)

这是SQL的说明,但是只要表中如果存在Text、ntext、image类型字段时,需要进行查询时,就会出现“不能以DISTINCT方式选择Text、ntext、image数据类型”
不知道怎么去解决这个问题?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: