关于表列更换为主轴的问题
问题是这样的:
表T1,字段有A,B,日期, 花费 
A B 日期 花费
-----------------------------------------------
1 配件 2006-12-16 2
1 配件 2006-12-17 4
1 配件 2006-12-18 16 
1 配件 2006-12-19 2
1 配件 2006-12-20 16
2 主件 2006-12-16 4
2 主件 2006-12-17 3
2 主件 2006-12-18 5
2 主件 2006-12-19 0
2 主件 2006-12-20 4
3 副件1 2006-12-16 4
3 副件1 2006-12-17 3
7 副件5 2006-12-16 5
7 副件5 2006-12-18 4
现在的要求是:
通过一个查询把日期添加到主轴,
字段有A,B,日期1,日期2,日期3... ,日期中存放的是花费.
A B 2006-12-16 2006-12-17 2006-12-18 总计
1 配件 2 4 16 22
2 主件 4 3 5 13
3 副件1 4 3 0 7 
7 副件5 5 0 4 9现在不知道这个查询怎么写,多谢大家了!

解决方案 »

  1.   

    declare @sql varchar(8000)
    set @sql = 'select a,b'
    select @sql = @sql + ' , sum(case 日期 when ''' + 日期 + ''' then 花费 else 0 end) [' + 日期 + ']'
    from (select distinct 日期 from tb) as a
    set @sql = @sql + ' from tb group by a,b'
    exec(@sql) 
      

  2.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb(A int,B varchar(10),日期 varchar(10),花费 int)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-16' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-17' ,4)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-18' ,16)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-19' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-20' ,16)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-16' ,4)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-17' ,3)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-18' ,5)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-19' ,0)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-20' ,4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-16', 4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-17', 3)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-16', 5)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-18', 4)
    godeclare @sql varchar(8000)
    set @sql = 'select a,b'
    select @sql = @sql + ' , sum(case 日期 when ''' + 日期 + ''' then 花费 else 0 end) [' + 日期 + ']'
    from (select distinct 日期 from tb) as a
    set @sql = @sql + ' from tb group by a,b order by a,b'
    exec(@sql) drop table tb/*
    a           b          2006-12-16  2006-12-17  2006-12-18  2006-12-19  2006-12-20  
    ----------- ---------- ----------- ----------- ----------- ----------- ----------- 
    1           配件         2           4           16          2           16
    2           主件         4           3           5           0           4
    3           副件1        4           3           0           0           0
    7           副件5        5           0           4           0           0
    */
      

  3.   

    --如果日期为DATETIME型.if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb(A int,B varchar(10),日期 datetime,花费 int)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-16' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-17' ,4)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-18' ,16)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-19' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-20' ,16)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-16' ,4)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-17' ,3)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-18' ,5)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-19' ,0)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-20' ,4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-16', 4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-17', 3)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-16', 5)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-18', 4)
    godeclare @sql varchar(8000)
    set @sql = 'select a,b'
    select @sql = @sql + ' , sum(case 日期 when ''' + convert(varchar(10),日期,120) + ''' then 花费 else 0 end) [' + convert(varchar(10),日期,120) + ']'
    from (select distinct convert(varchar(10),日期,120) 日期 from tb) as a
    set @sql = @sql + ' from tb group by a,b order by a,b'
    exec(@sql) /*
    a           b          2006-12-16  2006-12-17  2006-12-18  2006-12-19  2006-12-20  
    ----------- ---------- ----------- ----------- ----------- ----------- ----------- 
    1           配件         2           4           16          2           16
    2           主件         4           3           5           0           4
    3           副件1        4           3           0           0           0
    7           副件5        5           0           4           0           0*/drop table tb
      

  4.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb(A int,B varchar(10),日期 datetime,花费 int)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-16' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-17' ,4)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-18' ,16)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-19' ,2)
    insert into tb(A,B,日期,花费) values(1, '配件' ,'2006-12-20' ,16)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-16' ,4)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-17' ,3)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-18' ,5)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-19' ,0)
    insert into tb(A,B,日期,花费) values(2, '主件' ,'2006-12-20' ,4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-16', 4)
    insert into tb(A,B,日期,花费) values(3, '副件1', '2006-12-17', 3)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-16', 5)
    insert into tb(A,B,日期,花费) values(7, '副件5', '2006-12-18', 4)
    godeclare @sql varchar(8000)
    set @sql = 'select a,b'
    select @sql = @sql + ' , sum(case 日期 when ''' + convert(varchar(10),日期,120) + ''' then 花费 else 0 end) [' + convert(varchar(10),日期,120) + ']'
    from (select distinct convert(varchar(10),日期,120) 日期 from tb) as a
    set @sql = @sql + ' ,sum(花费) 总计 from tb group by a,b order by a,b'
    exec(@sql) drop table tb/*
    a           b          2006-12-16  2006-12-17  2006-12-18  2006-12-19  2006-12-20  总计          
    ----------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           配件         2           4           16          2           16          40
    2           主件         4           3           5           0           4           16
    3           副件1        4           3           0           0           0           7
    7           副件5        5           0           4           0           0           9
    */
      

  5.   

    谢谢dawugui(潇洒老乌龟) 刚给您加了100分
      

  6.   

    create table ta(A int,B varchar(50),日期 datetime, 花费 int)
    insert ta select 1, '配件', '2006-12-16', 2
    insert ta select 1, '配件', '2006-12-17', 4
    insert ta select 1, '配件', '2006-12-18', 16 
    insert ta select 1, '配件', '2006-12-19', 2
    insert ta select 1, '配件', '2006-12-20', 16
    insert ta select 2, '主件', '2006-12-16', 4
    insert ta select 2, '主件', '2006-12-17', 3
    insert ta select 2, '主件', '2006-12-18', 5
    insert ta select 2, '主件', '2006-12-19', 0
    insert ta select 2, '主件', '2006-12-20', 4
    insert ta select 3, '副件1', '2006-12-16', 4
    insert ta select 3, '副件1', '2006-12-17', 3
    insert ta select 7, '副件5', '2006-12-16', 5
    insert ta select 7, '副件5', '2006-12-18', 4declare @sql varchar(4000)
    set @sql=''
    select @sql=@sql+','+quotename(date)+'=sum(case convert(varchar(10),日期,120) when '+quotename(date,'''')
             +' then [花费] else 0 end)'
    from 
    (select distinct convert(varchar(10),日期,120) as date from ta)t 
    --print @sql
    exec('select a,b'+@sql+' from ta group by a,b')a           b                                                  2006-12-16  2006-12-17  2006-12-18  2006-12-19  2006-12-20
    ----------- -------------------------------------------------- ----------- ----------- ----------- ----------- -----------
    3           副件1                                                4           3           0           0           0
    7           副件5                                                5           0           4           0           0
    1           配件                                                 2           4           16          2           16
    2           主件                                                 4           3           5           0           4(4 行受影响)