参考:
/*
按月进行行列转换并加合计(2007-11-19于海南三亚)例如有表tb某些人每月消费数据如下:
id data month
001 11 1
001 12 2
001 13 3
001 14 4
001 15 5
001 16 6
001 17 7
001 18 8
001 19 9
001 110 10
001 111 11
001 112 12
002 21 1
002 22 2
002 23 3
002 24 4
002 25 5
002 26 6
002 27 7
002 28 8
002 29 9
002 210 10
002 211 11
002 212 12
要实现如下结果: 
人员 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
001  11  12  13  14  15  16  17  18  19  110  111  112
002  21  22  23  24  25   26 27  28  29  210  211  212
*/create table tb
(
  id    char(3),
  data  int,
  month int
)
insert into tb(id,data,month) values('001',11,1)
insert into tb(id,data,month) values('001',12,2)
insert into tb(id,data,month) values('001',13,3)
insert into tb(id,data,month) values('001',14,4)
insert into tb(id,data,month) values('001',15,5)
insert into tb(id,data,month) values('001',16,6)
insert into tb(id,data,month) values('001',17,7)
insert into tb(id,data,month) values('001',18,8)
insert into tb(id,data,month) values('001',19,9)
insert into tb(id,data,month) values('001',110,10)
insert into tb(id,data,month) values('001',111,11)
insert into tb(id,data,month) values('001',112,12)
insert into tb(id,data,month) values('002',21,1)
insert into tb(id,data,month) values('002',22,2)
insert into tb(id,data,month) values('002',23,3)
insert into tb(id,data,month) values('002',24,4)
insert into tb(id,data,month) values('002',25,5)
insert into tb(id,data,month) values('002',26,6)
insert into tb(id,data,month) values('002',27,7)
insert into tb(id,data,month) values('002',28,8)
insert into tb(id,data,month) values('002',29,9)
insert into tb(id,data,month) values('002',210,10)
insert into tb(id,data,month) values('002',211,11)
insert into tb(id,data,month) values('002',212,12)
goSELECT id as '人员' , 
  SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
  SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
  SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
  SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
  SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
  SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
  SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
  SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
  SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
  SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
  SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
  SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' 
FROM tb
GROUP BY ID drop table tb/*
人员 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
---- --- --- --- --- --- --- --- --- --- ---- ---- ----
001  11  12  13  14  15  16  17  18  19  110  111  112
002  21  22  23  24  25  26  27  28  29  210  211  212(所影响的行数为 2 行)
*/--------------------------------------------------------------
/*
合计每个人每年的数据
人员 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 合计
001  11  12  13  14  15  16  17  18  19  110  111  112  468
002  21  22  23  24  25   26 27  28  29  210  211  212  858
*/SELECT id as '人员' , 
SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' ,
SUM(data) as '合计'
FROM tb
GROUP BY ID /*
人员 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 合计
---- --- --- --- --- --- --- --- --- --- ---- ---- ---- ----
001  11  12  13  14  15  16  17  18  19  110  111  112  468
002  21  22  23  24  25  26  27  28  29  210  211  212  858
*/

解决方案 »

  1.   

    create table tb(A int,B int,C char(1),O char(2))
    insert tb select 1,1,'S','D' 
    insert tb select 1,2,'T','E' 
    insert tb select 1,2,'F','R' 
    insert tb select 1,1,'G','D' 
    insert tb select 1,1,'H','D' 
    insert tb select 1,3,'J','D' 
    insert tb select 2,2,'S','D' 
    insert tb select 2,2,'T','E'
    go
    create   function   f_str(@department  int) 
    returns   varchar(8000) 
    as 
    begin 
            declare   @ret   varchar(8000) 
            set   @ret   =   '' 
            select   @ret   =   @ret+case when charindex(O+',',@ret) > 0 then '' else ','+ O end    from   tb   where   A   =   @department 
            set   @ret   =   stuff(@ret,1,1,'') 
            return   @ret   
    end 
    gogodeclare @s varchar(8000)
    set @s = 'select A'
    select @s = @s + ',['+C+']= max(case when C = '''+C+''' then B else null end)'
    from (select distinct C from tb) aexec(@s + ',dbo.f_str(a) as O from tb group by a')drop table tb
    drop function f_str/*A           F           G           H           J           S           T           O                                                                                                                                                                                                                                                                
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    1           2           1           1           3           1           2           D ,E ,R 
    2           NULL        NULL        NULL        NULL        2           2           D ,E */
      

  2.   

    create table tb(A int,B int,C char(1),O char(2))
    insert tb select 1,1,'S','D' 
    insert tb select 1,2,'T','E' 
    insert tb select 1,2,'F','R' 
    insert tb select 1,1,'G','D' 
    insert tb select 1,1,'H','D' 
    insert tb select 1,3,'J','D' 
    insert tb select 2,2,'S','D' 
    insert tb select 2,2,'T','E'
    go
    create   function   f_str(@department  int) 
    returns   varchar(8000) 
    as 
    begin 
            declare   @ret   varchar(8000) 
            set   @ret   =   '' 
            select   @ret   =   @ret+case when charindex(O+',',@ret) > 0 then '' else ','+ O end    from   tb   where   A   =   @department 
            set   @ret   =   stuff(@ret,1,1,'') 
            return   @ret   
    end 
    gogodeclare @s varchar(8000)
    set @s = 'select A'
    select @s = @s + ',['+C+']= max(case when C = '''+C+''' then B else 0 end)'
    from (select distinct C from tb) aexec(@s + ',dbo.f_str(a) as O from tb group by a')drop table tb
    drop function f_str/*A           F           G           H           J           S           T           O                                                                                                                                                                                                                                                                
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    1           2           1           1           3           1           2           D ,E ,R 
    2           0           0           0           0           2           2           D ,E */
      

  3.   

    create table tb(A int,B int,C char(1),O varchar(2))
    insert tb select 1,1,'S','D' 
    insert tb select 1,2,'T','E' 
    insert tb select 1,2,'F','R' 
    insert tb select 1,1,'G','D' 
    insert tb select 1,1,'H','D' 
    insert tb select 1,3,'J','D' 
    insert tb select 2,2,'S','D' 
    insert tb select 2,2,'T','E'
    go
    create   function   f_str(@department  int) 
    returns   varchar(8000) 
    as 
    begin 
            declare   @ret   varchar(8000) 
            set   @ret   =   '' 
            select   @ret   =   @ret+case when charindex(O+'/',@ret) > 0 then '' else '/'+ rtrim(O) end    from   tb   where   A   =   @department 
            set   @ret   =   stuff(@ret,1,1,'') 
            return   @ret   
    end 
    gogodeclare @s varchar(8000)
    set @s = 'select A'
    select @s = @s + ',['+C+']= max(case when C = '''+C+''' then B else 0 end)'
    from (select distinct C from tb) aexec(@s + ',dbo.f_str(a) as O from tb group by a')drop table tb
    drop function f_str/*
    A           F           G           H           J           S           T           O                                                                                                                                                                                                                                                                
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    1           2           1           1           3           1           2           D/E/R
    2           0           0           0           0           2           2           D/E*/
      

  4.   


    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    服务器: 消息 313,级别 16,状态 2,行 1
    为过程或函数 dbo.f_str 提供的参数数目不够。
    为什么提示这个啊?
      

  5.   

    要是我的A列是VARCHAR(50)类型的怎么办啊?