要求统计每个客户下的订单总数:这句能理解:SELECT 客户表.姓名,COUNT(*) AS 订单总数
FROM 客户表,订单主表 
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名这句不能理解:SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
FROM 客户表,订单主表 
WHERE 客户表.客户编号 = 订单主表.客户编号
group by 客户表.姓名
问题:
上面那句我能理解,按照姓名分组,然后统计每个组的个数,第二句我不能理解,每个组为什么就能统计“订单主表.客户编号”的总数。
按照SQL Server帮助文档里面说的:
聚合函数每个组进行聚集;
SELECT 子句列表中的聚合函数提供有关每个组(而不是各行)的信息分组是按照“客户表.姓名”分组的,怎么能说明COUNT(订单主表.客户编号)就是每个组的信息啊?COUNT(订单主表.客户编号)不是整个订单主表吗?实在不能理解.........

解决方案 »

  1.   


    --
    SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
    --
    SELECT 客户表.姓名,COUNT(1) AS 订单总数
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
    --
    SELECT 客户表.姓名,COUNT(*) AS 订单总数
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名这几个是一样的,只是写法不同,在聚合函数内的字段不需出现在group by中,但不在聚合函数内的字段
    必须出现在group by 中
      

  2.   

    count是表联合之后 基于group By的字段统计 和count里面的内容没关系 count(1) 也都可以
      

  3.   

    GROUP BY就可以分组了 。。COUNT(订单主表.客户编号)是求的分组后的信息。
      

  4.   

    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 
    2、where子句基于指定的条件对记录行进行筛选; 
    3、group by子句将数据划分为多个分组; 
    4、使用聚集函数进行计算; 
    5、使用having子句筛选分组; 
    6、计算所有的表达式; 
    7、使用order by对结果集进行排序。 
    另外:一个查询语句各个部分的执行顺序: 
    --8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
    --(1)  FROM <left_table> 
    --(3)    <join_type> JOIN <right_table> 
    --(2)      ON <join_condition> 
    --(4)  WHERE <where_condition> 
    --(5)  GROUP BY <group_by_list> 
    --(6)  WITH {CUBE | ROLLUP} 
    --(7)  HAVING <having_condition> 
    --(10) ORDER BY <order_by_list> 
      

  5.   

    但这个是不同的,这个结果会是0,count(null)这是个很有用处的东西,以后很多地方你都会用到的
    ,可以简化很多语句SELECT 客户表.姓名,COUNT(null) AS 订单总数--此处为0
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
      

  6.   

    如果单是一个语句select count(*) from tb
    select count(字段) from tb --这个会过滤掉null值但是你的语句是一个内连接,join的时候已经过滤了客户编号 为null的所以结果肯定是一样的
      

  7.   

    分组是这样的 假如你join 后的数据是
    name  订单
    张三 订单1
    张三 订单2
    张三 订单3 
    李四 订单1
    李四 订单2group by name  就是按照name 分组 那么一样的是一组
    张三就是一组了,那么张三出现的次数也就是count 的结果
    也是订单次数
    这下总该明白了吧
      

  8.   

    楼主是不明白group by的用法? 楼上已经解释了,看明白了
      

  9.   

    和COUNT里面的内容有关系吧,比如,下面两句:SELECT 客户表.姓名,COUNT(客户表.客户编号) AS 订单总数
    FROM 客户表 LEFT JOIN 订单主表 
    ON 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
    FROM 客户表 LEFT JOIN 订单主表 
    ON 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
    上面两句的输出结果就不一样
      

  10.   

    left join 的当然有可能不一样了你第一次发的是inner join inner join 是一样的
      

  11.   

    我就是能理解
    SELECT 客户表.姓名,COUNT(客户表.客户编号) AS 订单总数
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
    不能理解
    SELECT 客户表.姓名,COUNT(订单主表.客户编号) AS 订单总数
    FROM 客户表,订单主表  
    WHERE 客户表.客户编号 = 订单主表.客户编号
    group by 客户表.姓名
      

  12.   

    你这两个结果一样啊
    count(字段) 过滤了null你要是真不理解 执行下面的语句 看结果去理解SELECT 客户表.姓名,客户表.客户编号,订单主表.客户编号 
    FROM 客户表,订单主表   
    WHERE 客户表.客户编号 = 订单主表.客户编号SELECT 客户表.姓名,客户表.客户编号,订单主表.客户编号 
    FROM 客户表 LEFT JOIN 订单主表   
    ON  客户表.客户编号 = 订单主表.客户编号
      

  13.   

    订单主表.客户编号 是主键 
    count(*)和count(订单主表.客户编号)是一个效果的
      

  14.   

    订单主表.客户编号 是主键  count(*)和count(订单主表.客户编号)是一个效果的