中国 中国湖南 长沙 男 200
中国 中国湖南 湘潭 男 800
。。
==================================
以上是基础数据,形成下面的统计数据的样式
=====================================
中国   中国湖南  男    1000
中国   中国湖南  女     500
中国   中国湖南        1500
中国   中国广州  男    2000
中国   中国广州  女     800
中国   中国广州        2800谢谢了

解决方案 »

  1.   

    select 地区,sum(数目) from 表 group by 地区;
      

  2.   

    楼上的写法是不对的,没那么简单。
    -------to 楼主为什么要这样统计呢,按国家  地区  男  女  总计来区分不是更好,sql也容易写啊
      

  3.   

    SQL> select * from t;COUNTRY              PROVINCE             CITY                 SEX         NUM
    -------------------- -------------------- -------------------- ---- ----------
    中国                 中国湖南             长沙                 男          200
    中国                 中国湖南             长沙                 女          300
    中国                 中国湖南             湘潭                 男          400
    中国                 中国广东             广州                 男          500
    中国                 中国广东             广州                 女          600
    中国                 中国广东             深圳                 男          700
    中国                 中国江苏             南京                 男          800
    中国                 中国江苏             南京                 女          600
    中国                 中国江苏             苏州                 男          800
    中国                 中国江苏             苏州                 女         1200
    中国                 中国湖南             湘潭                 女         1500
    中国                 中国广东             深圳                 女          40012 rows selectedSQL> select country,province,sex,sum(num) from t
      2  group by rollup(country,province,sex)
      3  having grouping_id(country,province,sex) <2
      4  /COUNTRY              PROVINCE             SEX    SUM(NUM)
    -------------------- -------------------- ---- ----------
    中国                 中国广东             男         1200
    中国                 中国广东             女         1000
    中国                 中国广东                        2200
    中国                 中国湖南             男          600
    中国                 中国湖南             女         1800
    中国                 中国湖南                        2400
    中国                 中国江苏             男         1600
    中国                 中国江苏             女         1800
    中国                 中国江苏                        34009 rows selected
      

  4.   

    duanzilin(寻)好强啊!!!不过有一个问题:
    如果一个省的城市中只有一个性别,不知道行不行。
      

  5.   

    如果不要having子句会把各个国家的总数和全部的总数列出来:
    SQL> select * from t;COUNTRY              PROVINCE             CITY                 SEX         NUM
    -------------------- -------------------- -------------------- ---- ----------
    中国                 中国湖南             长沙                 男          200
    中国                 中国湖南             长沙                 女          300
    中国                 中国湖南             湘潭                 男          400
    中国                 中国广东             广州                 男          500
    中国                 中国广东             广州                 女          600
    中国                 中国广东             深圳                 男          700
    中国                 中国江苏             南京                 男          800
    中国                 中国江苏             南京                 女          600
    中国                 中国江苏             苏州                 男          800
    中国                 中国江苏             苏州                 女         1200
    中国                 中国湖南             湘潭                 女         1500
    中国                 中国广东             深圳                 女          400
    美国                 佛罗里达洲           11                   男         2312
    美国                 佛罗里达洲           11                   女         135714 rows selectedSQL> select country,province,sex,sum(num) from t
      2  group by rollup(country,province,sex)
      3  /COUNTRY              PROVINCE             SEX    SUM(NUM)
    -------------------- -------------------- ---- ----------
    美国                 佛罗里达洲           男         2312
    美国                 佛罗里达洲           女         1357
    美国                 佛罗里达洲                      3669
    美国                                                 3669
    中国                 中国广东             男         1200
    中国                 中国广东             女         1000
    中国                 中国广东                        2200
    中国                 中国湖南             男          600
    中国                 中国湖南             女         1800
    中国                 中国湖南                        2400
    中国                 中国江苏             男         1600
    中国                 中国江苏             女         1800
    中国                 中国江苏                        3400
    中国                                                 8000
                                                        1166915 rows selected
      

  6.   

    to  waterfirer(水清) 
    如果城市只有1个性别,则统计的时候只会显示1个性别,不过合计还是会有的SQL> 
      4  /COUNTRY              PROVINCE             SEX    SUM(NUM)
    -------------------- -------------------- ---- ----------
    美国                 佛罗里达洲           男         2312
    美国                 佛罗里达洲           女         1357
    美国                 佛罗里达洲                      3669
    中国                 中国广东             男         1200
    中国                 中国广东             女         1000
    中国                 中国广东                        2200
    中国                 中国湖南             男          600
    中国                 中国湖南             女         1800
    中国                 中国湖南                        2400
    中国                 中国江苏             男         1600
    中国                 中国江苏             女         1800
    中国                 中国江苏                        3400
    中国                 中国上海             男       123213
    中国                 中国上海                      123213
      

  7.   

    谢谢duanzilin(寻),分析函数真是太强大了。学习、学习、再学习!!!
      

  8.   

    好厉害,问一下:grouping_id不太懂GROUPING_ID returns a number corresponding to the GROUPING bit vector associated with a row如果有多组值的话,grouping_id返回的值从0开始?
      

  9.   

    这里用grouping_id是过滤掉不满足你需求的纪录:
    grouping_id(country,province,sex) 应该有8种组合,依次是
    country,province,sex
    0        0         0
    0        0         1
    0        1         0
    0        1         1
    1        0         0
    1        0         1
    1        1         0
    1        1         1
    上面8种组合依次代表0-7,如果纪录中country,province,sex中sex为空时,则对应编码为1,country,province不为空则对应编码为0,那么grouping_id(country,province,sex)的值为2进制001,也就是1,它代表的也是国家的一个省的合计即
    country               province          sex
    中国                 中国广东         (null)         2200
    如果是下面这条纪录的话,grouping_id(country,province,sex)就为011,即3,是国家的合计
    country               province          sex
    中国                  (null)           (null)           8000这里不会出现这8种组合,你可以试试用cube(country,province,sex)这样8种组合应该会都出现,事实上,这里计算grouping_id并不是按空值来判断的,因为计算省合计的时候,性别有男和女2种,所以统计的时候性别列就为空,相应的grouping_id编码也就为1,就算原始纪录中存在相应列为空也不会影响grouping_id的值
      

  10.   

    补充一下,这里的rollup(),还有cube()都不是分析函数,官方文档上说rollup和cube是作为group by 的扩展子句,sql server 2000也有类似的用法
      

  11.   

    谢谢,to  duanzilin(寻) :太厉害了,崇拜ing,学习学习