SQL Server中如何分组查询最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server中如何分组查询最大值相关的知识,希望对你有一定的参考价值。

在这个表中有这些数据
T_name T_num classcode
yy 1 111
yy 2 222
yy 3 555
uu 1 111
uu 2 222
ii 1 111
ii 2 222
ii 3 333
oo 1 111
oo 2 555
oo 3 222
oo 4 333
想用这条语句:
SELECT * FROM templet GROUP BY T_name HAVING MAX(t_num)
得到这个结果:
T_name T_num classcode
yy 3 555
uu 2 222
ii 3 333
oo 4 333
但总是出错哪们高手能指点一下
这个问题就是得到这个表中安"T_name"列分组后提取“T_num”列最大值的所有列的信息

参考技术A SQL> with a as (select 1 a,0 b,'c1' c,'d1' d from dual
2 union
3 select 1 a,1 b,'c2' c,'d2' d from dual
4 union
5 select 1 a,3 b,'c3' c,'d3' d from dual
6 union
7 select 4 a,0 b,'c4' c,'d4' d from dual
8 union
9 select 5 a,1 b,'c5' c,'d5' d from dual
10 union
11 select 5 a,2 b,'c6' c,'d6' d from dual
12 union
13 select 6 a,1 b,'c7' c,'d7' d from dual
14 union
15 select 6 a,4 b,'c8' c,'d8' d from dual
16 )
17 SELECT A,B,C,D FROM
18 (select A,B,C,D,ROW_NUMBER()OVER(PARTITION BY A ORDER BY A,B DESC) RN from A)
19 WHERE RN=1
20 /

A B C D
---------- ---------- -- --
1 3 c3 d3
4 0 c4 d4
5 2 c6 d6
6 4 c8 d8

SQL>
参考技术B select * from templet where t_num in (SELECT MAX(t_num) FROM templet GROUP BY T_name)

要显示所有的 要利用到子查询
参考技术C 你这样肯定会出错哟
SELECT T_name,MAX(t_num) FROM templet GROUP BY T_name
这样弄看看
参考技术D SELECT top1 FROM templet GROUP BY T_name ORDER BY MAX(t_num) HAVING MAX(t_num);

试一下!~
第5个回答  2013-07-11 select name,sum(T_num) as t_num,sum(classcode) as classcode from templet group by name

sql server——分组查询(方法和思想)

思想

先排序在汇总

sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息。而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算。

 


 

 

使用GROUP BY进行分组查询

 

实例演示

 

--查询男女生的人数

 

 在没有学习分组查询之前,我们可以安装常规的思路解决查询需求:

 

select count(*) from student where sex=‘男‘

 

select count(*) from student where sex=‘女‘

 

那么现在又要个需要时,查询每个班级的总人数

如果按照常规解决查询,那么我们应该思考的是:

1.每个班级,我们并不知道在表里有哪些班级,那么我们where 后的条件如何写?

2.如果该表里有1000个班级,那么我难道要写一千条where查询语句?

面对这样的问题 sql server为我们准备了Group by 关键字实现分组查询

 

在使用介绍Group by关键字之前,我们先来看看系统实现分组查询的原理和逻辑:

技术分享

 

映射成SQL语句:

select sex ,count(*)  as 人数  from student group by sex

这个简短的语句,经过上图的原理,应该要知道,第一步是先from查询表的所有信息,然后group by根据字段进行分组后在统计汇总

 

上面的案例是通过Count()函数进行统计,当然分组汇总还可以使用其他的聚合函数进行汇总。

 

 

使用GROUP BY 语句注意事项一:

技术分享

 

图中使用查询语句,包含一个字段和一个聚合函数为什么会报错呢?

原因,我们把两个字段分开来查询:

技术分享

 

总结:为了保证完整性,系统约定俗成,在使用了聚合函数的查询语句中,除了聚合函数,可以在查询列表上,要出现其他字段,那么该字段就必须为分组字段,而且该字段一定要跟随在GROUP BY关键字后面。

    与聚合函数一起出现在select后面进行查询的列,只有两种可能性:被聚合 、被分组

 

 

 


 

 

多列分组查询

 

--实例需求,查询每一个班级,男女生的人数

分析:显然需求是两组,每一个班需要划分组,男女也需要分组

实现图解:

技术分享

SQL语句:

select  GradeId,sex,COUNT(*)  from student group by GradeId,Sex order by GradeId

经验:搞清楚需要分几组,搞清楚分组的顺序,一轮一轮的分,系统是等分组之后才会进行汇总信息

 

 


 

 

使用HAVING子句

 

演示示例:--查询每一个班级男女生的人数,同时只需要显示人数数量超过3人的记录

分析:此查询显然是对上一个示例的多列分组进行筛选。

 

试在这学的知识范围内来解决此查询需求。。。。

 

一、那么就按照我们学的where来进行筛选

结果如图:

技术分享

这个错误告诉了我们:where里面不能出现聚合函数作为条件,失败!

 

 

 

二、既然不能使用聚合函数,那就给聚合函数取一个别名,让它当做一个列

结果如图:

技术分享

错误原因:原因是where是对源数据进行筛选的,也就是对from 后面的表进行筛选,既然是源数据,那么where去源数据表里找一个别名字段,怎么可能会有!所以才会报错

 

 

让我们来探讨一下,这里为什么不能使用where

1.需求是对分组之后的数据集进行筛选,where只针对数据表原始数据筛选

2.where关键字显然只能出现一次,而且根据查询的顺序,是先执行where条件筛选后得到的结果集,在进行的group by分组

 

 

 

解决办法,使用HAVING关键字:

HAVING核心:是对分组统计之后的结果集,进行数据的筛选

SQL语句:

select  GradeId,sex,COUNT(*)  as renshu from student  group by GradeId,Sex  having count(*)>=3 order by GradeId

 

where和having的不同:where是对原始数据进行筛选,having是对分组时候的数据进行筛选

 


 

 

查询语句的执行顺序

在这里引出查询机制里对查询语句里的关键字的执行顺序

 

查询关键字家族成员

select  top/distinct 字段列表 from 表列表 where 筛选条件 group by 分组字段列表 having  对分组之后得到的结果集筛选  order by 排序字段列表

 

 

执行顺序:

1.from

2.where

3.group by

4.having

5.根据select 关键之后的要显示的字段,进行结果集显示

6.order by 对最终结果集进行排序

7.top/dictinct

 

 

 

以上是关于SQL Server中如何分组查询最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL Server 在此查询中按天对结果进行分组?

SQL查询取分组最大值

SQL查询取分组最大值

mysql查询分组中最大的值

sql如何求分组计数之后计数的最大值

mysql 分组子查询sql怎么写