本帖最后由 fanday 于 2009-06-17 10:19:19 编辑

解决方案 »

  1.   

    不奇怪,这是MYSQL对标准SQL的扩展,允许在GROUP BY中不必包含所有的非聚合字段。至于是好是坏就看各自观点了。 其实每个数据库都对SQL有些自己的补充。http://dev.mysql.com/doc/refman/5.1/zh/introduction.html#extensions-to-ansi
    1.8.4. MySQL对标准SQL的扩展
    MySQL服务器包含一些其他SQL DBMS中不具备的扩展。注意,如果使用了它们,将无法把代码移植到其他SQL服务器。在某些情况下,你可以编写包含MySQL扩展的代码,但仍保持其可移植性,方法是用“/*... */”注释掉这些扩展。o        不需要在GROUP BY部分命名所有选择的列。对于某些十分特殊但相当正常的查询,它能提供更好的性能。请参见12.10节,“与GROUP BY子句同时使用的函数和修改程序”。o        可以与GROUP BY一起指定ASC和DESC。
      

  2.   

    这个没问题 
    select country,province,district,sex,sum(num) 
    from t 
    group by country,province,district,sex 就可以了 因为你是按 country,province,sex 
     分组的呀。这三个字段相同就会累加。。
      

  3.   

    我个人,不推荐这种非标SQL语法,如果在你的程序中这么用,将来会导致移植性上的麻烦。或者某个MySQL运行在“ANSI”模式下,程序就会报语法错了。
      

  4.   

    同志,没看出来吗,故意把district从group中拿出来的,仔细看看,看懂了估计对你有帮助。
      

  5.   

    這种用法有時候很方便, 從Trans-SQL轉過一下接受不到. 
    我也一樣.
      

  6.   

    写出这个SQL,恐怕也不太了解sql吧
      

  7.   

    这个写法不标准, 因为假如没group的字段如果有多个值, 可能导致这个字段会有不确定的值.
    然而,假如可以确定这个字段都是重复的值(譬如多表联接), 那就没有这方面的捆饶,反而会简化SQL语句,也有可能会提高性能.比如以下语句
    select A.id, B.desc, B.XXX, B.YYY SUM(A.AMT) 
        FROM A
        join b on a.id=b.id
        where a.id=? and b.xxx=?
        group a.id假如有标准的SQL语句写, 要么要好几个嵌套, 要么group 后面很长