select count(categoryID),count(areaID) 
from Product
group by category,areaID
select count(categoryID),count(areaID) 
from Product
group by areaID,categoryID
这两个语句的结果不一致,说明group by 是先按照第一个字段分组,再按照第二个字段分组,得到结果的。
个人时间原因没来得及做实验,各位有什么看法,一起讨论下。哪里有GROUP BY 的定义说明文档呢,谢谢?

解决方案 »

  1.   

    说明group by 是先按照第一个字段分组,再按照第二个字段分组
      

  2.   

     在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。   在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数   select max(sal),job emp group by job;
       (注意max(sal),job的job并非一定要出现,但有意义)   查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。  select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;  当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件
     
      where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
      having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
      

  3.   

    研究价值不大,正常不会这样写语句,因为select的字段不全
      

  4.   

    存在不一致的问题存在于 category 和 categoryID 的成对匹配上。
      

  5.   

    如果 category 和 categoryID 是严格的一一对应,理论上两条语句的执行结果相同。注意:输出结果集中记录排序可能不一致。
      

  6.   

    指定用来放置输出行的组。如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。指定 GROUP BY 时,选择列表中任意非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。注意:  
    如果未指定 ORDER BY 子句,则使用 GROUP BY 子句返回的组没有任何特定的顺序。若要指定特定的数据排序,建议您始终使用 ORDER BY 子句。
     
     Transact-SQL 语法约定语法
     
    [ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
        [ WITH { CUBE | ROLLUP } ] 

     参数
    ALL 包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。 group_by_expression进行分组所依据的表达式。group_by_expression 也称为组合列。group_by expression 可以是列,也可以是引用由 FROM 子句返回的列的非聚合表达式。不能使用在选择列表中定义的列别名来指定组合列。注意:  
    不能在 group_by_expression 中使用类型为 text、ntext 和 image 的列。
     
    对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。 不能直接在 group_by_expression 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。CUBE 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。GROUP BY 汇总行在结果中显示为 NULL,但用来表示所有值。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其他操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。 ROLLUP 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。重要事项:  
    使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。
     
    示例
    A. 使用简单 GROUP BY 子句
    以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。USE AdventureWorks ;
    GO
    SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
    FROM Sales.SalesOrderDetail sod
    GROUP BY SalesOrderID
    ORDER BY SalesOrderID ;
     B. 将 GROUP BY 子句用于多个表
    以下示例检索与 Employee 表联接的 Address 表中的各 City 的雇员数。USE AdventureWorks ;
    GO
    SELECT a.City, COUNT(e.AddressID) EmployeeCount
    FROM HumanResources.Employee e 
    INNER JOIN Person.Address a
    ON e.AddressID = a.AddressID
    GROUP BY a.City
    ORDER BY a.City ;
     
      

  7.   

    select count(categoryID),count(areaID) 
    from Product 
    group by category,areaID 
    select count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 分组字段不一样,结果当然不同,很正常
      

  8.   


    同楼上问,category 和 categoryID 是否一一对应?
      

  9.   

    仔细研究会发现,实际记录集是一样的,只是记录排序不同select count(categoryID),count(areaID) 
    from Product 
    group by category,areaID 
    默认select count(categoryID),count(areaID) 
    from Product 
    group by category,areaID 
    order by category,areaID 
    select count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 
    默认
    select count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 
    order by areaID,categoryID 
    所以,建议你比较
    select count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 
    order by areaID,categoryID 

    select count(categoryID),count(areaID) 
    from Product 
    group by categoryID,areaID
    order by areaID,categoryID 
    的结果是否不同
      

  10.   

    结果集肯定是一样的,只是结果的排序方式可能不一样而已。
    如果都加上ORDER BY areaID,categoryID,那么结果集就完全一样了。
      

  11.   

    结果集内容应该是一样的,只是顺序可能不同。
    if object_id('[product]') is not null drop table [product]
    go
    create table [product]([categoryid] int,[areaid] int)
    insert [product]
    select 1,10 union all
    select 1,10 union all
    select 1,11 union all
    select 1,null union all
    select null,1 union all
    select 2,11 union all
    select 2,12 union all
    select 3,12select categoryID,areaID,count(categoryID),count(areaID) 
    from Product 
    group by categoryID,areaID 
    /*
    categoryID  areaID                  
    ----------- ----------- ----------- -----------
    1           NULL        1           0
    NULL        1           0           1
    1           10          2           2
    1           11          1           1
    2           11          1           1
    2           12          1           1
    3           12          1           1
    */select categoryID,areaID,count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 
    /*
    categoryID  areaID                  
    ----------- ----------- ----------- -----------
    NULL        1           0           1
    1           NULL        1           0
    1           10          2           2
    1           11          1           1
    2           11          1           1
    2           12          1           1
    3           12          1           1
    */
      

  12.   

    如果categoryID,areaID 这两个是对应的话,查询的结果应该是完全一样的,顺序可能会有不同……
      

  13.   

    结果应该是一样的。无论你group by后面的字段,都是把后面字段的组合到一起成为一组。
    建议楼主再仔细看看
      

  14.   

    在select 后面跟上category,areaID 看看select category,areaID,count(categoryID),count(areaID)
    from Product
    group by category,areaID
    select category,areaID,count(categoryID),count(areaID)
    from Product
    group by areaID,categoryID 结果应该一致
      

  15.   

    说明group by 是先按照第一个字段分组,再按照第二个字段分组
      

  16.   

    说明group by 是先按照第一个字段分组,再按照第二个字段分组其实我是来接分的
      

  17.   

    Sorry!没仔细看楼主的内容。1.如果group by list 都不一样,比较各自的结果。我认为没有什么意义。
    2.如果group by list 是一样的,而列的顺序不同,那么结果一定是一样的。
      

  18.   

    SQL Server 2005的开发文档是个很好的工具啊,
      

  19.   

    按楼主这种分组可能存在不一致的结果,除非category 和 categoryID 是严格的一一对应。
    如果分组字段相同而位置不同,电脑处理的时间可能有很大的差别。
    以前我也没注意这方面问题,最近才感觉到它的存在。
      

  20.   

    结果集是一样。只是如12楼所说,默认的排序会影响结果的排序,如果使用order by指定排序,就会出现一模一样的结果。
      

  21.   


    Transact-SQL 语法约定 语法 [ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
        [ WITH { CUBE | ROLLUP } ] 

    参数 
    ALL 包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。 如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。 group_by_expression 进行分组所依据的表达式。group_by_expression 也称为组合列。group_by expression 可以是列,也可以是引用由 FROM 子句返回的列的非聚合表达式。不能使用在选择列表中定义的列别名来指定组合列。 注意:  
    不能在 group_by_expression 中使用类型为 text、ntext 和 image 的列。 对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。 不能直接在 group_by_expression 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。 CUBE 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。GROUP BY 汇总行在结果中显示为 NULL,但用来表示所有值。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。 结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其他操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。 ROLLUP 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。 重要事项:  
    使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。 示例 
    A. 使用简单 GROUP BY 子句 
    以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。 USE AdventureWorks ; 
    GO 
    SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
    FROM Sales.SalesOrderDetail sod 
    GROUP BY SalesOrderID 
    ORDER BY SalesOrderID ; 
    B. 将 GROUP BY 子句用于多个表 
    以下示例检索与 Employee 表联接的 Address 表中的各 City 的雇员数。 USE AdventureWorks ; 
    GO 
    SELECT a.City, COUNT(e.AddressID) EmployeeCount 
    FROM HumanResources.Employee e 
    INNER JOIN Person.Address a 
    ON e.AddressID = a.AddressID 
    GROUP BY a.City 
    ORDER BY a.City ; 
      

  22.   


    Transact-SQL 语法约定 语法 [ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
        [ WITH { CUBE | ROLLUP } ] 

    参数 
    ALL 包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。 如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。 group_by_expression 进行分组所依据的表达式。group_by_expression 也称为组合列。group_by expression 可以是列,也可以是引用由 FROM 子句返回的列的非聚合表达式。不能使用在选择列表中定义的列别名来指定组合列。 注意:  
    不能在 group_by_expression 中使用类型为 text、ntext 和 image 的列。 对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。 不能直接在 group_by_expression 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。 CUBE 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。GROUP BY 汇总行在结果中显示为 NULL,但用来表示所有值。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。 结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其他操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。 ROLLUP 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。 重要事项:  
    使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。 示例 
    A. 使用简单 GROUP BY 子句 
    以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。 USE AdventureWorks ; 
    GO 
    SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
    FROM Sales.SalesOrderDetail sod 
    GROUP BY SalesOrderID 
    ORDER BY SalesOrderID ; 
    B. 将 GROUP BY 子句用于多个表 
    以下示例检索与 Employee 表联接的 Address 表中的各 City 的雇员数。 USE AdventureWorks ; 
    GO 
    SELECT a.City, COUNT(e.AddressID) EmployeeCount 
    FROM HumanResources.Employee e 
    INNER JOIN Person.Address a 
    ON e.AddressID = a.AddressID 
    GROUP BY a.City 
    ORDER BY a.City ; 
      

  23.   

    结果相同,排序不同
    group by 应该是按后面的排列顺序来分组
    因为只有这样,rollup与cube才能正常统计!
      

  24.   

    在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。   在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数   select max(sal),job emp group by job; 
      (注意max(sal),job的job并非一定要出现,但有意义)   查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。   select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;   当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件   where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 
      having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 
      

  25.   

    select count(categoryID),count(areaID) 
    from Product 
    group by category,areaID 
    select count(categoryID),count(areaID) 
    from Product 
    group by areaID,categoryID 两者结果相同,排序不同。Transact-SQL 语法约定 语法 [ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
        [ WITH { CUBE | ROLLUP } ] 

    参数 
    ALL 包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。 如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。 group_by_expression 进行分组所依据的表达式。group_by_expression 也称为组合列。group_by expression 可以是列,也可以是引用由 FROM 子句返回的列的非聚合表达式。不能使用在选择列表中定义的列别名来指定组合列。 注意:  
    不能在 group_by_expression 中使用类型为 text、ntext 和 image 的列。 对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。 不能直接在 group_by_expression 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。 CUBE 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。GROUP BY 汇总行在结果中显示为 NULL,但用来表示所有值。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。 结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其他操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。 ROLLUP 指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。 重要事项:  
    使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。 示例 
    A. 使用简单 GROUP BY 子句 
    以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。 USE AdventureWorks ; 
    GO 
    SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
    FROM Sales.SalesOrderDetail sod 
    GROUP BY SalesOrderID 
    ORDER BY SalesOrderID ; 
    B. 将 GROUP BY 子句用于多个表 
    以下示例检索与 Employee 表联接的 Address 表中的各 City 的雇员数。 USE AdventureWorks ; 
    GO 
    SELECT a.City, COUNT(e.AddressID) EmployeeCount 
    FROM HumanResources.Employee e 
    INNER JOIN Person.Address a 
    ON e.AddressID = a.AddressID 
    GROUP BY a.City 
    ORDER BY a.City ; 
      

  26.   

    --例子
    --group by F1,F2,F3
    group by子句是按照先F1分组在F1内再按照F2分组,最后在F2内按照F3分组。
      

  27.   

    select category,areaID,count(categoryID),count(areaID)
    from Product
    group by category,areaID
    order by categoryselect category,areaID,count(categoryID),count(areaID)
    from Product
    group by areaID,categoryID 
    order by category
    结果肯定是一致的
    因为它们是按包含最少的记录来分组的,比如:
    areaid  categoryid
     1001     a001
     1001     a001
     1002     a001
     1002     a001
    那么它就是按"areaid"分组的,与跟 在group by 后面的顺序没有关系.