group by使用详解

看完这篇文章,你就能了解为什么会产生这个错误了:

在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句。

group by 的作用就是对数据进行分组,比如有一个表记录销售状况的。有销售ID,产品ID,销售数量。那么如果我想查看某单销售记录总销售的数量。那么就需要用到group by了。

表的全部记录如下

销售ID

 产品ID销售数量
1120
1250
2160
3515

select 销售ID,SUM(销售数量) from 销售记录表 group by 销售ID

那么按产品ID分组,查看个产品的销售状况呢?

select 产品ID,SUM(销售数量) from 销售记录表 group by 销售ID

其它使用注意事项:

  1. SQL Server为每一个定义的组产生一个列值。也就是上面那个产品ID,或销售ID。
  2. 只为每一个指定的列返回单一的行。也就是,该列被distinct了。不过这个group by最大的作用不是用来去除重复的哦。呵呵。
  3. 所有在group by子句中指定的列必须出现在select 选择列中。
  4. 如果包含where,那么只对满足where条件的行进行分组。
  5. group by列的大小、聚合的列和包含在查询中的聚合的值限制了列项的数目,这个限制来源于中间工作表每行最多只能有8060字节的限制,中间工作表用来存放中间查询结果。
  6. 空值NULL是作为一个组来处理的。
  7. 使用All关键字与group by子句显示在聚合列中含有空值的所有行,而忽略这些记录是否满足where子句。也就是说ALL可以否决where。

使用having为group by设置过滤条件。having的作用和select 的where作用大致相同。

having使用注意:

having只有与group by配合使用,才有效果,否则,有having 而无group by,那是没有意义的。

可以引用任何出现在选择列的列。记得,一定要出现的。

有having时,All无效。

示例:use northwind select productid,sum(quantity) as total_quantity from orderhist group by productid having sum(quantity)>30 go

按productid进行分组,并设置筛选条件:某类产品总量大于30,才被查找出来。

现在明白了having的用法,那么说说为什么产生开始说的错误吧。

group by 是专为聚合函数而设计的,如果在select选择列中没有出现聚合函数的列,而在group by子句中也没出现,那么,就会报开头说讲的错误。所以解决的办法就只有这样,要么把select中,没有进行聚合函数运算的列删除,要么在group by子句中加上该列。

再谈谈能够使用聚合函数的数据类型:

count能对所有类型使用,count(*)返回该表总记录条数。count(字段名)返回该字段非空值的总记录数。如果count(*)是30,但(产品介绍)字段有3个空值,那么count(产品介绍)返回27。

sum 和avg只能对数值类型进行运算,如int smallint tinyint decimal float real money smallmoney

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22168574/viewspace-666509/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22168574/viewspace-666509/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值