找回密码
 FreeOZ用户注册
查看: 1853|回复: 9
打印 上一主题 下一主题

[数据库] SQL Group By 的使用心得

[复制链接]
跳转到指定楼层
1#
发表于 1-7-2009 00:24:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
原来用这个GROUP BY稀里糊涂的,最近用的稍微多了一点,总结出来一点土道理,分享一下,大家看看对不对。

SELECT
【分组字段1】,【分组字段2】, ... ,【分组字段N】,
【聚合字段1】,【聚合字段1】, ... ,【聚合字段1】
FROM 表名
GROUP BY
【分组字段1】,【分组字段2】, ... ,【分组字段N】

表内的字段分成两组,一组是需要进行分组的字段,从左到有,越分越细。
剩下的字段就是对最小组的数据进行聚合,也就是使用聚合函数,可以是 COUNT, SUM, AVG 等等

SELECT 后面跟的 分组字段 一定要和 GROUP BY 后边跟的 分组字段 保持一致。
修正,上面这句话是错的,不一致没问题。比如:
select Count(*), ShipCity, ShipCountry, COUNT(*)
from Orders
group by ShipCountry, ShipCity
这句运行通过了,其实只要前面SELECT部分的字段一定要包含后边GROUP BY所指明的所有字段就好。

[ 本帖最后由 xblues 于 7-7-2010 22:13 编辑 ]
回复  

使用道具 举报

2#
发表于 1-7-2009 10:38:20 | 只看该作者
回复  

使用道具 举报

3#
发表于 1-7-2009 16:17:52 | 只看该作者
看了虫子说的,让我变得困惑了。好在,我有做了几个实验,现在一起讨论一下。
简单来说吧。
使用group by 的时个,某个字段中相同的值将会被认为是一个,为了不出现one to many的情况,所以需要用到聚合函数。
最简单和明了的解释如下:
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。
我懒得做实验了,如果分成多个group by, 改如何显示?

后来的同学,有空请补上。
回复  

使用道具 举报

4#
发表于 1-7-2009 16:27:54 | 只看该作者
group by 若有order by子句,则order by后面的子句后面的列也必须出现在 group by 后面。
回复  

使用道具 举报

5#
发表于 2-7-2009 18:21:37 | 只看该作者
自己多动手是学好数据库的第一要领。
回复  

使用道具 举报

6#
发表于 3-7-2009 01:46:05 | 只看该作者
SELECT 后面跟的 分组字段 一定要和 GROUP BY 后边跟的 分组字段 保持一致。
这句没错,因为我有几次的出错信息,就是这么说地。
回复  

使用道具 举报

7#
发表于 3-7-2009 02:04:10 | 只看该作者
这是入门的冬冬?
回复  

使用道具 举报

8#
 楼主| 发表于 3-7-2009 02:43:31 | 只看该作者
提示: 作者被禁止或删除, 无法发言
这是我自己总结的土经验,和书上的道理不同,很有意义的。
回复  

使用道具 举报

9#
发表于 3-7-2009 18:30:22 | 只看该作者
虫子好学呀,佩服
回复  

使用道具 举报

10#
发表于 7-7-2009 03:04:17 | 只看该作者
原帖由 stgeorge 于 2009-7-1 15:17 发表
看了虫子说的,让我变得困惑了。好在,我有做了几个实验,现在一起讨论一下。
简单来说吧。
使用group by 的时个,某个字段中相同的值将会被认为是一个,为了不出现one to many的情况,所以需要用到聚合函数。
最 ...如果分成多个group by, 改如何显示?[/

每太看懂这个问题是什么意思, ‘分成 多个group by’ ??

使用group by的时候还可以用上 with cube 和with rollup
with rollup 给出每一级分组的累计值统计,从第一级分组字段到最后一级,order by会决定这种分级结构
例如 order by year, quarter, month

year   quarter   month    sum
null   null        null     1660
2008    null        null   1000
2008    4        null     1000
2008    4       12        1000
2009    null     null     660
2009    1        null     60
2009    1        1         10
2009    1        2         20
2009    1        3         30
2009    2        null     600
2009    2       4        100
2009    2        5         200
2009    2        6         300


with cube 会产生另外一种结果
例如 order by year, quarter, month

year   quarter   month    sum
null   null        null     1660
null   null        1       10
......
null   null        5       200
null   null        6       1300
null   1          1        10
...
null   2          6        1300  (2008.6 quarter 2 + 2009.6 quarter 2)
2008    null        null   1000
2008    2        null     1000
2008    2       6         1000
2009    null     null     660
2009    1        null     60
2009    1        1         10
2009    1        2         20
2009    1        3         30
2009    2        null     600
2009    2       4        100
2009    2        5         200
2009    2        6         300

另外还可以用 having 子句去 筛选

group by year, quarter, month having sum(sum) > 500
结果集里只包含汇总金额大于500的那些记录

评分

参与人数 1威望 +30 收起 理由
xblues + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 15-12-2024 03:42 , Processed in 0.044186 second(s), 26 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表