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 材料 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]')这样达不到列能够排序的功能。或是有没更好的方式?谢谢
在网上找的例子
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?
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
*/
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)