表A有品号,客户简称,客户品号,品名,规格,预交货日,订单数量,我想按预交货日得到品号,客户简称,客户品号,品名,规格,一月订单数量,二月订单数量。十二月订单数量,其中会有个别月份没有此品号的订单,可以用NULL代替?谢谢各位大侠

解决方案 »

  1.   

    行列转换加合计例如有表A某些人每月消费数据如下:
    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  212create table 表A
    (
      id    char(3),
      data  int,
      month int
    )
    insert into 表A(id,data,month) values('001',11,1)
    insert into 表A(id,data,month) values('001',12,2)
    insert into 表A(id,data,month) values('001',13,3)
    insert into 表A(id,data,month) values('001',14,4)
    insert into 表A(id,data,month) values('001',15,5)
    insert into 表A(id,data,month) values('001',16,6)
    insert into 表A(id,data,month) values('001',17,7)
    insert into 表A(id,data,month) values('001',18,8)
    insert into 表A(id,data,month) values('001',19,9)
    insert into 表A(id,data,month) values('001',110,10)
    insert into 表A(id,data,month) values('001',111,11)
    insert into 表A(id,data,month) values('001',112,12)
    insert into 表A(id,data,month) values('002',21,1)
    insert into 表A(id,data,month) values('002',22,2)
    insert into 表A(id,data,month) values('002',23,3)
    insert into 表A(id,data,month) values('002',24,4)
    insert into 表A(id,data,month) values('002',25,5)
    insert into 表A(id,data,month) values('002',26,6)
    insert into 表A(id,data,month) values('002',27,7)
    insert into 表A(id,data,month) values('002',28,8)
    insert into 表A(id,data,month) values('002',29,9)
    insert into 表A(id,data,month) values('002',210,10)
    insert into 表A(id,data,month) values('002',211,11)
    insert into 表A(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 表A
    GROUP BY ID drop table 表A人员 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  858SELECT 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 表A
    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
      

  2.   

    数据量比较大的时候,用SUM CASE效率比较低,用临时表来代替会好些。
      

  3.   


    select 品号,客户简称,客户品号,品名,规格,sum(订单数量)订单数量,'1' 月份 
    into #tmp01
    from 表A where 预交货日 ='一月'
    ...
    select 品号,客户简称,客户品号,品名,规格,sum(订单数量)订单数量,'12'月份 
    into #tmp12
    from 表A where 预交货日 ='十二月'create table t(品号,客户简称,客户品号,品名,规格,1月,2月,...,12月)
    insert into t 
    select distinct 品号,客户简称,客户品号,品名,规格
    from 表Aupdate t
    set 1月 = 订单数量
    from #tmp01 
    where 品号= t.品号 and 月份 ='1'
    ...update t
    set 1月 = 订单数量
    from #tmp01 
    where 品号= t.品号 and 月份 ='12'select * from t
      

  4.   

    --手误
    update t
    set 12月 = 订单数量
    from #tmp12
    where 品号= t.品号 and 月份 ='12'
      

  5.   

    借用楼上数据:
    use test
    go
    use test
    go
    create table 表A
    (
      id    char(3),
      data  int,
      month int
    )
    insert into 表A(id,data,month) values('001',11,1)
    insert into 表A(id,data,month) values('001',12,2)
    insert into 表A(id,data,month) values('001',13,3)
    insert into 表A(id,data,month) values('001',14,4)
    insert into 表A(id,data,month) values('001',15,5)
    insert into 表A(id,data,month) values('001',16,6)
    insert into 表A(id,data,month) values('001',17,7)
    insert into 表A(id,data,month) values('001',18,8)
    insert into 表A(id,data,month) values('001',19,9)
    insert into 表A(id,data,month) values('001',110,10)
    insert into 表A(id,data,month) values('001',111,11)
    insert into 表A(id,data,month) values('001',112,12)
    insert into 表A(id,data,month) values('002',21,1)
    insert into 表A(id,data,month) values('002',22,2)
    insert into 表A(id,data,month) values('002',23,3)
    insert into 表A(id,data,month) values('002',24,4)
    insert into 表A(id,data,month) values('002',25,5)
    insert into 表A(id,data,month) values('002',26,6)
    insert into 表A(id,data,month) values('002',27,7)
    insert into 表A(id,data,month) values('002',28,8)
    insert into 表A(id,data,month) values('002',29,9)
    insert into 表A(id,data,month) values('002',210,10)
    insert into 表A(id,data,month) values('002',211,11)
    insert into 表A(id,data,month) values('002',212,12)
    godeclare @i int,@s nvarchar(4000)
    select @i=1,@s=''
    while @i!>12
    select @s=@s+',['+rtrim(@i)+'月]=sum(case when [month]='+rtrim(@i)+' then data else 0 end)',@i=@i+1
    exec('select ID'+@s+' from 表A group by ID')
    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
    002  21          22          23          24          25          26          27          28          29          210         211         212
      

  6.   

    ----预交货日为datetime类型时declare @i int,@s nvarchar(4000)
    select @i=1,@s=''
    while @i!>12
    select @s=@s+',['+rtrim(@i)+'月]=sum(case when month([预交货日])='+rtrim(@i)+' then data else 0 end)',@i=@i+1
    exec('select ID'+@s+' from 表A group by ID,year(预交货日)')----以上生成的语句为
    select ID,year(预交货日)
    [1月]=sum(case when month([预交货日])=1 then data else 0 end),
    [2月]=sum(case when month([预交货日])=2 then data else 0 end),
    [3月]=sum(case when month([预交货日])=3 then data else 0 end),
    [4月]=sum(case when month([预交货日])=4 then data else 0 end),
    [5月]=sum(case when month([预交货日])=5 then data else 0 end),
    [6月]=sum(case when month([预交货日])=6 then data else 0 end),
    [7月]=sum(case when month([预交货日])=7 then data else 0 end),
    [8月]=sum(case when month([预交货日])=8 then data else 0 end),
    [9月]=sum(case when month([预交货日])=9 then data else 0 end),
    [10月]=sum(case when month([预交货日])=10 then data else 0 end),
    [11月]=sum(case when month([预交货日])=11 then data else 0 end),
    [12月]=sum(case when month([预交货日])=12 then data else 0 end) from 表A group by ID,year(预交货日)