表如下:id    time_cycle    area_id     sub_area_id     value
1     20110301      10          1001            13
2     20110301      10          1002            10
3     20110301      10          1003            12
4     20110301      20          2001            15
5     20110301      20          2002            11
6     20110302      10          1001            15
7     20110302      10          1002            12
8     20110302      10          1003            10
9     20110302      20          2001            20
10    20110302      20          2002            12
11    20110401      10          1001            11
12    20110401      10          1002            12
13    20110401      10          1003            13
14    20110401      20          2001            14
15    20110401      20          2002            15
16    20110402      10          1001            16
17    20110402      10          1002            17
18    20110402      10          1003            18
19    20110402      20          2001            19
20    20110402      20          2002            20希望出如下结果  area       sub_erea            201103          201104
   10        1001                 28               27
             1002                 22               29
             1003                 22               31
total                             72               81   20        2001                 35               33
             2002                 23               35
total                             58               68不知道是不是描述清楚了。有疑问请问。
可惜最高只能给100分。

解决方案 »

  1.   

    如果用 mysql 自带的 rollup 功能,则汇总的栏是NULL,如果要完全希望自己定制,那就写几个 union 就是了。如下为使用 rollup 功能的语句和结果:
    - 语句
    select area_id, sub_area_id, sum(if(left(time_cycle, 6) = "201103", value, 0)) as "201103", sum(if(left(time_cycle, 6) = "201104", value, 0)) as "201104"
    from test
    group by  area_id, sub_area_id
    with rollup
    - 结果:10 1001 28 27
    10 1002 22 29
    10 1003 22 31
    10 72 87
    20 2001 35 33
    20 2002 23 35
    20 58 68
    130 155
      

  2.   

    select area_id  area ,ifnull(sub_area_id,'total') as  sub_area,sum(case when left(time_cycle,6)=201103 then value else 0 end) `201103`,sum(case when left(time_cycle,6)=201104 then value else 0 end) `201104` from tb  group by area_id,sub_area_id with rollup;
    +------+----------+--------+--------+
    | area | sub_area | 201103 | 201104 |
    +------+----------+--------+--------+
    |   10 | 1001     |     28 |     27 |
    |   10 | 1002     |     22 |     29 |
    |   10 | 1003     |     22 |     31 |
    |   10 | total    |     72 |     87 |
    |   20 | 2001     |     35 |     33 |
    |   20 | 2002     |     23 |     35 |
    |   20 | total    |     58 |     68 |
    | NULL | total    |    130 |    155 |
    +------+----------+--------+--------+
    8 rows in set (0.00 sec)
      

  3.   

    多谢楼上这位朋友
    的确可以实现我想要的功能
    不过随着日期的增长,sql会需要每个月改一次?
      

  4.   

    你可以直接    DATE_FORMAT(time_cycle,'%y%M')  得到当前月。