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不重复的记录数
相关文章
- 【经典算法】冒泡排序
- 经典算法题每日演练——第十七题 Dijkstra算法
- Java实现 LeetCode 743 网络延迟时间(Dijkstra经典例题)
- 链路分析 K.O “五大经典问题”
- JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
- java.sql.SQLException: The SQL statement must not be null or empty.这个错误
- 【学习总结】SQL的学习-2-sql操作
- 24个经典的MySQL索引问题,你都遇到过哪些?
- Docker 必须要懂的经典网络模式 bridge 网络
- javaScript面向对象继承方法经典实现
- SQL SERVER服务器链接连接(即sql server的跨库连接)
- Atitit 图像处理30大经典算法attilax总结
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
- openGauss内核分析:SQL by pass & 经典执行器
- 010-Hadoop Hive sql语法详解5-HiveQL与SQL区别
- 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)
- sql 精读(四) 标准 SQL 中聚合分析功能示例
- 白话经典算法系列之六 高速排序 高速搞定
- SQL注入 Sqli-labs-Less-21(笔记)——还是回显注入 使用union select即可 但是要注意sql括号闭合 也可以报错注入
- Oracle 常用的经典SQL查询
- 分布式系统经典论文汇总