有一个表的数据结构如下:
org       item   acbl    trdt(日期)
机构1 项目1 12.87 20070131
机构1 项目2 1.45 20070131
机构1 项目3 3.45 20070131
机构1 项目1 12.87 20070228
机构1 项目2 1.45 20070228
机构1 项目3 3.45 20070228
机构2 项目1 12.87 20070131
机构2 项目2 1.45 20070131
机构2 项目3 3.45 20070131
机构2 项目1 12.87 20070228
机构2 项目2 1.45 20070228
机构2 项目3 3.45 20070228日期还会增加的
如何得到下表数据
机构 项目 20070131 20070228
机构1 项目1 12.87 12.87
机构1 项目2 1.45 1.45
机构1 项目3 3.45 3.45
机构2 项目1 12.87 12.87
机构2 项目2 1.45 1.45
机构2 项目3 3.45 3.45看了很多行列转换的例子,还是不太懂,特请帮忙,谢谢!

解决方案 »

  1.   

    create table #t(org varchar(10),item varchar(10),acbl numeric(20,6),trdt char(8))
    insert into #t
    select '机构1','项目1',12.87,'20070131'
    union all select '机构1','项目2',1.45,'20070131'
    union all select '机构1','项目3',3.45,'20070131'
    union all select '机构1','项目1',12.87,'20070228'
    union all select '机构1','项目2',1.45,'20070228'
    union all select '机构1','项目3',3.45,'20070228'
    union all select '机构2','项目1',12.87,'20070131'
    union all select '机构2','项目2',1.45,'20070131'
    union all select '机构2','项目3',3.45,'20070131'
    union all select '机构2','项目1',12.87,'20070228'
    union all select '机构2','项目2',1.45,'20070228'
    union all select '机构2','项目3',3.45,'20070228'declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+',max(case when trdt='''+trdt+''' then acbl else 0 end) as '''+trdt+''''
    from (select distinct trdt from #t)t
    exec('select org,item'+@sql+' from #t group by org,item order by org,item')
    /*
    org        item       20070131               20070228               
    ---------- ---------- ---------------------- ---------------------- 
    机构1        项目1        12.870000              12.870000
    机构1        项目2        1.450000               1.450000
    机构1        项目3        3.450000               3.450000
    机构2        项目1        12.870000              12.870000
    机构2        项目2        1.450000               1.450000
    机构2        项目3        3.450000               3.450000
    */
      

  2.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb(org varchar(10),item varchar(10),acbl decimal(18,2),trdt varchar(10))
    insert into tb(org,item,acbl,trdt) values('机构1','项目1',12.87,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构1','项目2',1.45,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构1','项目3',3.45,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构1','项目1',12.87,'20070228')
    insert into tb(org,item,acbl,trdt) values('机构1','项目2',1.45,'20070228')
    insert into tb(org,item,acbl,trdt) values('机构1','项目3',3.45,'20070228')
    insert into tb(org,item,acbl,trdt) values('机构2','项目1',12.87,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构2','项目2',1.45,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构2','项目3',3.45,'20070131')
    insert into tb(org,item,acbl,trdt) values('机构2','项目1',12.87,'20070228')
    insert into tb(org,item,acbl,trdt) values('机构2','项目2',1.45,'20070228')
    insert into tb(org,item,acbl,trdt) values('机构2','项目3',3.45,'20070228')
    go
    declare @sql varchar(8000)
    set @sql = 'select org,item'
    select @sql = @sql + ' , max(case trdt when ''' + trdt + ''' then acbl end) [' + trdt + ']'
    from (select distinct trdt from tb) as a
    set @sql = @sql + ' from tb group by org,item order by org , item'
    exec(@sql) drop table tb/*
    org        item       20070131             20070228             
    ---------- ---------- -------------------- -------------------- 
    机构1        项目1        12.87                12.87
    机构1        项目2        1.45                 1.45
    机构1        项目3        3.45                 3.45
    机构2        项目1        12.87                12.87
    机构2        项目2        1.45                 1.45
    机构2        项目3        3.45                 3.45
    */