例表如下:

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

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

  1. SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变

    前提  本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...

  2. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  3. 【转】SQL删除重复数据方法,留着备用

    感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name ...

  4. (转载)SQL删除重复数据方法

    本文转载自http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name         ...

  5. sql 查出一张表中重复的所有记录数据

    1.在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下: select * from xi a where (a.username) in ...

  6. SQL删除重复数据方法

    例如: id           name         value 1               a                 pp 2               a           ...

  7. 【转】SQL删除重复数据方法

    例如: id           name         value 1               a                 pp 2               a           ...

  8. SQL删除重复数据,保留一条

    例如: id           name         value 1               a                 pp 2               a           ...

  9. 统计数据方面SQL与HQL

    因为HQL是面向对象的,所以对于统计数据方面使用HQL时不合适的,其实HQL最终还是会转化成SQL语句,项目里使用HQL语句应该是为了标准规范化. 统计的数据:同一个表,同一个字段,不同属性,统计不同 ...

随机推荐

  1. UML学习-总体概念篇

    前言:我们在实施一个项目时,前期的设计是非常重要的,如建筑师在建造一个建筑时,需要事先设计图纸,设计图纸是设计的语言,是不同的工程设计人员.设计人员和生产人员之间进行沟通的语言,在一个现代化的工程里面 ...

  2. ORACLE 小写金额转大写金额

    Create Or Replace Function Money2Chinese(Money In Number) Return Varchar2 Is strYuan Varchar2(); str ...

  3. HDOJ2008数值统计

    数值统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. 人生的抉择—aspx、ashx、asmx文件处理请求效率比较

    人生总是面临着许多抉择许多困惑!作为一名"攻城师"或"程序猿"的我们,工作的时候更是如此.你曾经是否苦恼过在系统中使用哪种文件编写客户端请求最合适或最高效呢?a ...

  5. CSS之照片翻转

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. 有趣的hello word

    程序一 #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #def ...

  7. 第三十九篇、NavBar动态隐藏、设置透明、毛玻璃效果

    1.动态隐藏 - (void)viewDidLoad { [super viewDidLoad]; if ([self respondsToSelector:@selector(automatical ...

  8. Cocos2d-x中停止播放背景音乐

    停止背景音乐播放代码放置到什么地方比较适合呢?例如:在HelloWorld场景中,主要代码如下: bool HelloWorld::init() { return true; } void Hello ...

  9. 重建Mac系统的文件打开方式

    /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Ver ...

  10. JS判断移动设备最佳方法

    最实用的还是下面这个: 方法一:纯JS判断 使用这方法既简单,又实用,不需要引入jQuery库,把以下代码加入到<head>里即可. <script type=”text/javas ...