FreeOZ论坛

标题: SQL Group By 的使用心得 [打印本页]

作者: xblues    时间: 1-7-2009 00:24
提示: 作者被禁止或删除, 无法发言 标题: SQL Group By 的使用心得
原来用这个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 编辑 ]
作者: MacroJ    时间: 1-7-2009 10:38

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

后来的同学,有空请补上。
作者: stgeorge    时间: 1-7-2009 16:27
group by 若有order by子句,则order by后面的子句后面的列也必须出现在 group by 后面。
作者: 流浪的狗    时间: 2-7-2009 18:21
自己多动手是学好数据库的第一要领。
作者: erictsai    时间: 3-7-2009 01:46
SELECT 后面跟的 分组字段 一定要和 GROUP BY 后边跟的 分组字段 保持一致。
这句没错,因为我有几次的出错信息,就是这么说地。
作者: felix100    时间: 3-7-2009 02:04
这是入门的冬冬?
作者: xblues    时间: 3-7-2009 02:43
提示: 作者被禁止或删除, 无法发言 这是我自己总结的土经验,和书上的道理不同,很有意义的。
作者: 大杨树    时间: 3-7-2009 18:30
虫子好学呀,佩服
作者: wukong    时间: 7-7-2009 03:04
原帖由 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的那些记录




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/bbs/) Powered by Discuz! X3.2