Office中国论坛/Access中国论坛

标题: access 分组的问题 [打印本页]

作者: canhuihui    时间: 2009-4-27 11:36
标题: access 分组的问题
我想知道在access的查询里面用sql语句的group by, group by后面必须列出select后面的所有字段名称, 是吧? 如果是,好像意味着每一条记录就是一个组, 如果在select后面用coutn(*)的话, 一定为1.
可是, 我只想按照其中一个字段分组, 并且得出每组的记录个数。我该怎么办?
不知道有没有说明白, 请指教。
作者: todaynew    时间: 2009-4-27 11:42
按那个字段或那几个字段分组,就在group by后列出这些字段。
作者: canhuihui    时间: 2009-4-27 13:26
在access里面是不是不可以那样啊, 因为access帮助文档中关于group by介绍里面写道:在 SELECT 字段列表中的所有字段必须包含于 GROUP BY 子句中,或作为参数包含于 SQL 聚合函数中。
并且我没有在group by后面列全的话, 有一个报错信息“试图执行的查询中不包含作为合计函数一部分的特定表达式,'姓名'”, 我的sql语句是:
SELECT 美国签.领区, 美国签.姓名
FROM 美国签
GROUP BY 美国签.领区;

如果我在group by后面将两个字段名称都写上的话, 就不报错。
作者: Henry D. Sy    时间: 2009-4-27 17:07
GROUP BY 子句
将记录与指定字段中的相等值组合成单一记录。如果使 SQL 合计函数,例如 Sum或Count,蕴含于 SELECT 语句中,会创建一个各记录的总计值。

语法
SELECT 字段表
    FROM 表
    WHERE标准
    [GROUP BY 分组字段表]

包含 GROUP BY 子句的 SELECT 语句具有以下几个部分:

部分 说明
fieldlist 要和任何字段名别名, SQL 合计函数, 选择断定 (ALL, DISTINCT, DISTINCTROW, 或 TOP),或其他 SELECT 语句 选择一起检索的字段名称。
table 从其中获取记录的表的名称。欲知更多信息请看 FROM 子句.
criteria 选择准则。如果此语句包含一个 WHERE 子句, Microsoft Jet 数据库引擎 会在记录上应用WHERE条件,然后把值分组。
groupfieldlist 用来对记录分组的字段名,最多有 10 个字段。在 groupfieldlist 中字段名的顺序将决定组层次,由最高至最低的层次来分组。


说明
GROUP BY 是可选的。

如果在 SELECT 语句中没有 SQL 合计函数,则可省略总计值。

Null值在 GROUP BY字段中,则会被分组而不被省略。但是在任何 SQL 合计函数中不计算 Null 值。

使用 WHERE 子句可以排除您不想分组的行,而将记录分组后,用 HAVING 子句过滤这些记录。

除非包含备注数据或 OLE 对象数据,否则, GROUP BY 字段列表中的字段可引用 FROM 子句中的任何表的任何字段,即使 SELECT 语句不包含此字段,只要它至少包含一个 SQL 合计函数即可。Microsoft® Jet 数据库引擎无法在“备注对象”或“OLE 对象”字段上进行分组。

SELECT 字段列表中的全部字段必须包含在 GROUP BY 子句中,或在 SQL 合计函数中作为参数。
作者: todaynew    时间: 2009-4-27 17:58
本帖最后由 todaynew 于 2009-4-27 18:00 编辑
在access里面是不是不可以那样啊, 因为access帮助文档中关于group by介绍里面写道:在 SELECT 字段列表中的所有字段必须包含于 GROUP BY 子句中,或作为参数包含于 SQL 聚合函数中。
并且我没有在group by后面列全 ...
canhuihui 发表于 2009-4-27 13:26

呵呵,你是不是想找出某个领区对应的姓名?如果是这样的话,不是分组问题,而是要在where后写条件。

如下的分组没有什么实际意义,分与不分结果一样:
SELECT 美国签.领区, 美国签.姓名
FROM 美国签
GROUP BY 美国签.领区,美国签.姓名;
作者: canhuihui    时间: 2009-5-13 08:52
谢谢, 等我慢慢研究。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3