关于group及having的疑问

殇客 2017-07-17 11:49:58
 
create TABLE Table1
(
ID int identity(1,1) primary key NOT NULL,
classid int,
sex varchar(10),
age int,
)
Insert into Table1 values(1,'男',20)
Insert into Table1 values(2,'女',22)
Insert into Table1 values(3,'男',23)
Insert into Table1 values(4,'男',22)
Insert into Table1 values(1,'男',24)
Insert into Table1 values(2,'女',19)
Insert into Table1 values(4,'男',26)
Insert into Table1 values(1,'男',24)
Insert into Table1 values(1,'男',20)
Insert into Table1 values(2,'女',22)
Insert into Table1 values(3,'男',23)
Insert into Table1 values(4,'男',22)
Insert into Table1 values(1,'男',24)
Insert into Table1 values(2,'女',19)

select classid 班级,COUNT(*) '>20岁人数' from Table1 where sex='男' group by classid,age having age>'20'



以上,结果中有两个班级4,为什么没有合并呢?
...全文
268 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinger126 2017-07-18
  • 打赏
  • 举报
回复
having是对聚合列进行判断,对分组列进行判断是放在where条件中的
  • 打赏
  • 举报
回复
having 是对聚合后的判断吧
卖水果的net 2017-07-17
  • 打赏
  • 举报
回复
group by 你写了两个列,class,age
殇客 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 hjywyj 的回复:
select classid 班级,COUNT(*) '>20岁人数' from Table1 where sex='男' and age>20 group by classid
首先这个是可以的,我现在在学having的用法,如果用having语句能达到这种效果吗?
  • 打赏
  • 举报
回复
select classid 班级,COUNT(*) '>20岁人数' from Table1 where sex='男' and age>20 group by classid
吉普赛的歌 2017-07-17
  • 打赏
  • 举报
回复
引用 9 楼 awsl123456 的回复:
[quote=引用 8 楼 zbdzjx 的回复:] HAVING 相当于前面的语句运行完后,再筛选。 所以,group by 后面没有age,HAVING 后面也就不能加age,除非是min(age)、max(age)这类。 如果只统计age>20的,那就只能放到where中。
大概理解你的意思了,就是having后面跟的要么是在聚合函数中使用过的列,要么就是合计类函数是吧? 另外还有个其他的问题,就是我用first()、ucase()这类函数的提示“不是可以识别的 内置函数名称”,这个是什么情况?我用的是sqlserver 2008[/quote] 可能你弄混淆了, 把其它数据库的语法带进来了吧。 first() => SELECT TOP 1 name FROM Websites ORDER BY id ASC; ucase() => SELECT UPPER('abc')
殇客 2017-07-17
  • 打赏
  • 举报
回复
引用 8 楼 zbdzjx 的回复:
HAVING 相当于前面的语句运行完后,再筛选。 所以,group by 后面没有age,HAVING 后面也就不能加age,除非是min(age)、max(age)这类。 如果只统计age>20的,那就只能放到where中。
大概理解你的意思了,就是having后面跟的要么是在聚合函数中使用过的列,要么就是合计类函数是吧? 另外还有个其他的问题,就是我用first()、ucase()这类函数的提示“不是可以识别的 内置函数名称”,这个是什么情况?我用的是sqlserver 2008
zbdzjx 2017-07-17
  • 打赏
  • 举报
回复
HAVING 相当于前面的语句运行完后,再筛选。 所以,group by 后面没有age,HAVING 后面也就不能加age,除非是min(age)、max(age)这类。 如果只统计age>20的,那就只能放到where中。
二月十六 2017-07-17
  • 打赏
  • 举报
回复
select 后边的Table1.age也要去掉
殇客 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 hjywyj 的回复:
select classid 班级,COUNT(*) '>20岁人数' from Table1 where sex='男' and age>20 group by classid
首先这个是可以的,我现在在学having的用法,如果用having语句能达到这种xiao
引用 3 楼 wmxcn2000 的回复:
group by 你写了两个列,class,age
我如果只留一个classid,不写age就会报错 消息 8121,级别 16,状态 1,第 1 行 HAVING 子句中的列 'Table1.age' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
二月十六 2017-07-17
  • 打赏
  • 举报
回复
group by了两列,所以就不是按classid分组了,是按照classid 和age分组统计的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧