FID       FITEM    FNAME     FAMOUNT
1 材料 1060.01 528862.23
1 材料 1070.24 0.00
1 材料 1070.29 110406.53
1 材料 1070.99 9094498.04
2 人工 1060.01 336576.25
2 人工 1060.02 168866.74
2 人工 1060.03 564299.71
2 人工 1060.04 3682.13
3 费用 1060.01 226828.53
3 费用 1060.02 341042.64
3 费用 1060.03 470119.12
3 费用 1060.04 79915.99
3 费用 1060.05 29855.51
3 费用 1060.99 467914.68
4 其他 1060.02 351228.42
4 其他 1060.99 1295204.29
4 其他 1070.20 0.00
4 其他 1070.21 0.00
4 其他 1070.23 148181.64以上四列数据,想要得到的功能是
FID     FITEM      ..........FNAME 转换为各列,每项不同,有多有少都要加到列.......................
1       材料                 材料对应各列的汇总值
2       人工                 人工对应各列的汇总值
3       费用                 费用对应各列的汇总值
4       其他                 其他对应各列的汇总值要求:结果是要能够按FID排序,另外FNAME转换的各列,要能够按FNAME升序从左向右排列
在网上找的例子
declare @s nvarchar(4000)
set @s=''
Select  @s=@s+','+quotename([subject])+'=max(case when [subject]='+quotename([subject],'''')+' then [grade] else 0 end)'
from Class group by[subject]
exec('select [student]'+@s+' from Class group by [student]')这样达不到列能够排序的功能。或是有没更好的方式?谢谢

解决方案 »

  1.   

    这个不好办,一般都是按照你显示的字段来排序,如果按FNAME,就是按照FNAME来排序的。
      

  2.   

    要求:结果是要能够按FID排序,另外FNAME转换的各列,要能够按FNAME升序从左向右排列
    在网上找的例子
    declare @s nvarchar(4000)
    set @s=''
    Select @s=@s+','+quotename([subject])+'=max(case when [subject]='+quotename([subject],'''')+' then [grade] else 0 end)'
    from Class group by[subject]
    exec('select [student]'+@s+' from Class group by [student]')结果是要能够按FID排序?在后面加个order by fid?
      

  3.   

    create table tb(FID int,FITEM varchar(10), FNAME varchar(10),FAMOUNT decimal(18,2))
    insert into tb values(1 ,'材料', '1060.01', 528862.23)
    insert into tb values(1 ,'材料', '1070.24', 0.00)
    insert into tb values(1 ,'材料', '1070.29', 110406.53)
    insert into tb values(1 ,'材料', '1070.99', 9094498.04)
    insert into tb values(2 ,'人工', '1060.01', 336576.25)
    insert into tb values(2 ,'人工', '1060.02', 168866.74)
    insert into tb values(2 ,'人工', '1060.03', 564299.71)
    insert into tb values(2 ,'人工', '1060.04', 3682.13)
    insert into tb values(3 ,'费用', '1060.01', 226828.53)
    insert into tb values(3 ,'费用', '1060.02', 341042.64)
    insert into tb values(3 ,'费用', '1060.03', 470119.12)
    insert into tb values(3 ,'费用', '1060.04', 79915.99)
    insert into tb values(3 ,'费用', '1060.05', 29855.51)
    insert into tb values(3 ,'费用', '1060.99', 467914.68)
    insert into tb values(4 ,'其他', '1060.02', 351228.42)
    insert into tb values(4 ,'其他', '1060.99', 1295204.29)
    insert into tb values(4 ,'其他', '1070.20', 0.00)
    insert into tb values(4 ,'其他', '1070.21', 0.00)
    insert into tb values(4 ,'其他', '1070.23', 148181.64)
    godeclare @sql varchar(8000)
    set @sql = 'select FID ,FITEM '
    select @sql = @sql + ' , sum(case FNAME when ''' + FNAME + ''' then FAMOUNT else 0 end) [' + FNAME + ']'
    from (select distinct FNAME from tb) as a
    set @sql = @sql + ' from tb group by FID ,FITEM order by fid'
    exec(@sql) drop table tb/*
    FID         FITEM      1060.01                                  1060.02                                  1060.03                                  1060.04                                  1060.05                                  1060.99                                  1070.20                                  1070.21                                  1070.23                                  1070.24                                  1070.29                                  1070.99                                  
    ----------- ---------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- 
    1           材料         528862.23                                .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      110406.53                                9094498.04
    2           人工         336576.25                                168866.74                                564299.71                                3682.13                                  .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      .00                                      .00
    3           费用         226828.53                                341042.64                                470119.12                                79915.99                                 29855.51                                 467914.68                                .00                                      .00                                      .00                                      .00                                      .00                                      .00
    4           其他         .00                                      351228.42                                .00                                      .00                                      .00                                      1295204.29                               .00                                      .00                                      148181.64                                .00                                      .00                                      .00
    */
      

  4.   

    支持一下 有个SQL SERVER 2000/2005 实现行转列和列转行  去参考看看 
      

  5.   

    #3楼的正确declare @sql varchar(8000)
    set @sql = 'select FID ,FITEM '
    select @sql = @sql + ' , sum(case FNAME when ''' + FNAME + ''' then FAMOUNT else 0 end) [' + FNAME + ']'
    from (select distinct FNAME from tb) as a
    set @sql = @sql + ' from tb group by FID ,FITEM order by fid'
    exec(@sql)