rdate:注册时间,area 区号,phonenum号码,现在要查A,B表,所有在一段时间内注册的号码总数,如2012.1.1-2013.8.1,要求按地市区号,按年,月来分,统计总数,结果如下显示:
   年   月  南京   苏州   泰州  连云港 
2012 1   500     600    700   800
2012  2  100    200     600    100   
这个里面知道应该要用到case 语句,但是怎么把表A,B的结果关联,然后按照年月地市来统计呢?mssql

解决方案 »

  1.   

    行列转换,请参考:
    http://blog.csdn.net/hdhai9451/article/details/5026933  
      

  2.   

    就是A 存储如下数据:
    rdate/*注册时间*/    area  phonenum
    2013-1-1              南京  123
    2012-12-1             大连  1234
    表B存储的同样的数据,只是列名不一样,就叫brdate,barea, bphonenum
    现在要统计某一段时间内即rdate如在12年1月到13年8月期间,注册的用户总数,要求按照年月地市来统计,统计出来的格式为:
     年   月  南京   苏州   泰州  连云港 
    2012 1   500     600    700   800
    2012  2  100    200     600    100   
      

  3.   

    --把A,B两表符合条件的结果合并到C表
    create table C(rdate datetime,area varchar(100),phonenum int)
    insert into C
    select rdate,area,phonenum from A where (条件表达式)
    union all select brdate,barea, bphonenum from B where (条件表达式)
    --动态生成sql 语句
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql + ',['+rtrim(area)+']=sum(case area when '''+rtrim(area)+''' then phonenum end)'
    from C group by area
    exec('select convert(varchar(7),rdate,120) as rdate'+@sql+'from  C group by convert(varchar(7),rdate,120)' )
      

  4.   

    你好,phonenum 是字符串类型手机号码。用于sum函数显示无效,另外@sq= 后面的写法 是固定的吗?类似',[]=sum()' 想问下 ['+rtrim(area)+'] 里面rtrim 函数的用意,是去除掉空格?
    因为动态sql 没怎么接触。
      

  5.   

    哦 函数换成count 就可以了。
      

  6.   

    还有就是@sql + ',['+rtrim(area)+']=sum(case area when '''+rtrim(area)+''' then phonenum end)' 这句,sum函数里面的 '''+rtrim(area)+''' 写成 '+rtrim(area)+'好像也不影响执行,这样有什么不妥吗?