--行列转换吧?
/*
普通行列转换
(爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文  74
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94
*/-------------------------------------------------------------------------
/*
想变成 
姓名         语文        数学        物理          
---------- ----------- ----------- ----------- 
李四         74          84          94
张三         74          83          93
*/create table tb
(
   Name    varchar(10) ,
   Subject varchar(10) ,
   Result  int
)insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
/*
姓名         语文        数学        物理          
---------- ----------- ----------- ----------- 
李四         74          84          94
张三         74          83          93
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql) 
/*
姓名         数学        物理        语文          
---------- ----------- ----------- ----------- 
李四         84          94          74
张三         83          93          74
*/-------------------------------------------------------------------
/*加个平均分,总分
姓名         语文        数学        物理        平均分                总分          
---------- ----------- ----------- ----------- -------------------- ----------- 
李四         74          84          94          84.00                252
张三         74          83          93          83.33                250
*/--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理,
  cast(avg(result*1.0) as decimal(18,2)) 平均分,
  sum(result) 总分
from tb
group by name
/*
姓名         语文        数学        物理        平均分                总分          
---------- ----------- ----------- ----------- -------------------- ----------- 
李四         74          84          94          84.00                252
张三         74          83          93          83.33                250
*/--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1) 
/*
姓名         数学        物理        语文        平均分                总分          
---------- ----------- ----------- ----------- -------------------- ----------- 
李四         84          94          74          84.00                252
张三         83          93          74          83.33                250
*/drop table tb ---------------------------------------------------------
---------------------------------------------------------
/*
如果上述两表互相换一下:即姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94想变成 
Name       Subject Result      
---------- ------- ----------- 
李四         语文      74
李四         数学      84
李四         物理      94
张三         语文      74
张三         数学      83
张三         物理      93
*/create table tb1
(
   姓名 varchar(10) ,
   语文 int ,
   数学 int ,
   物理 int
)insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
(
  select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
  union all
  select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  union all
  select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
/*加个平均分,总分
Name       Subject     Result               
---------- -------    -------------------- 
李四         语文      74.00
李四         数学      84.00
李四         物理      94.00
李四         平均分    84.00
李四         总分      252.00
张三         语文      74.00
张三         数学      83.00
张三         物理      93.00
张三         平均分    83.33
张三         总分      250.00
*/select * from
(
  select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
  union all
  select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  union all
  select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
  union all
  select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
  union all
  select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1

解决方案 »

  1.   

    create table A(编号 int,姓名 varchar(10),金额 money,类别编号 varchar(10))
    insert into A select 1,'张和',120.02,'01'
    insert into A select 2,'扬蓝',230.00,  '01'
    insert into A select 4,'李东',520.00,  '02'
    insert into A select 6,'何新',  98.00,  '05'
    insert into A select 1,'张和',220.00,  '05'
    create table B(类别编号 varchar(10),类别名称 varchar(10),顺序号 int)
    insert into B select  '01',      '西药费',    1 
    insert into B select  '02',      '中药费',    2 
    insert into B select  '03',      '成药费',    3 
    insert into B select  '04',      '化验费',    4 
    insert into B select  '05',      '治疗费',    5 declare @sql varchar(8000)
    set @sql='select 编号,姓名'
    select @sql=@sql+',['+类别编号+']=max(case 类别编号 when '''+类别编号+''' then 金额 else 0 end)' from (select distinct 类别编号 from B)a
    set @sql=@sql+' from A group by 编号,姓名'
    exec(@sql)
      

  2.   


    加排序和去掉.000的情况
    declare @sql varchar(8000)
    set @sql='select 编号,姓名'
    select @sql=@sql+',['+类别编号+']=max(case 类别编号 when '''+类别编号+''' then cast(金额 as varchar) else ''0'' end)' from (select distinct 类别编号 from B)a
    set @sql=@sql+' from A group by 编号,姓名 order by 编号'
    exec(@sql)
      

  3.   

    create table tb1(编号 int,姓名 nvarchar(20),金额 decimal(10,2),类别编号 varchar(10))
    insert tb1 select 1,N'张和',120.02,'01'
    insert tb1 select 2,N'杨蓝',230.00,'01'
    insert tb1 select 4,N'李东',520.00,'02'
    insert tb1 select 6,N'何新',98.00,'05'
    insert tb1 select 1,N'张和',220.00,'05'create table tb2(类别编号 varchar(10),类别名称 nvarchar(20),顺序号 int)
    insert tb2 select '01',N'西药费',1
    insert tb2 select '02',N'中药费',2
    insert tb2 select '03',N'成药费',3
    insert tb2 select '04',N'化验费',4
    insert tb2 select '05',N'治疗费',5select a.编号,a.姓名,cast(sum(case when b.类别名称=N'西药费' then a.金额 else 0 end) as varchar) as 西药费,
                cast(sum(case when b.类别名称=N'中药费' then a.金额 else 0 end) as varchar) as 中药费,
                cast(sum(case when b.类别名称=N'成药费' then a.金额 else 0 end) as varchar) as 成药费,
                cast(sum(case when b.类别名称=N'化验费' then a.金额 else 0 end) as varchar) as 化验药费,
                cast(sum(a.金额) as varchar) as 治疗费
    from tb1 a left join tb2 b
    on a.类别编号=b.类别编号
    group by a.编号,a.姓名
    order by a.编号drop table tb1,tb2/*
    编号          姓名     西药费           中药费      成药费       化验药费             治疗费                            
    ----------- ------------- ---------- ------------------- ------------ ------------ ---- 
    1           张和        120.02          0.00        0.00          0.00        340.02
    2           杨蓝        230.00          0.00       0.00       0.00               230.00
    4           李东        0.00        520.00     0.00      0.00                  520.00
    6           何新        0.00        0.00        0.00           0.00              98.00(所影响的行数为 4 行)
    */
      

  4.   

    create table A(编号 int, 姓名 varchar(10), 金额 decimal(18,2), 类别编号 varchar(10))
    insert into A values(1, '张和', 120.02, '01')
    insert into A values(2, '扬蓝', 230.00, '01')
    insert into A values(4, '李东', 520.00, '02')
    insert into A values(6, '何新', 98.00 , '05')
    insert into A values(1, '张和', 220.00, '05')
    create table B(类别编号 varchar(10), 类别名称 varchar(10),顺序号 int)
    insert into B values('01', '西药费', 1 )
    insert into B values('02', '中药费', 2 )
    insert into B values('03', '成药费', 3 )
    insert into B values('04', '化验费', 4 )
    insert into B values('05', '治疗费', 5 )
    goselect A.编号,A.姓名,
      sum(case B.类别名称 when '西药费' then A.金额 else 0 end) '西药费',
      sum(case B.类别名称 when '中药费' then A.金额 else 0 end) '中药费',
      sum(case B.类别名称 when '成药费' then A.金额 else 0 end) '成药费',
      sum(case B.类别名称 when '化验费' then A.金额 else 0 end) '化验费',
      sum(case B.类别名称 when '治疗费' then A.金额 else 0 end) '治疗费'
    from A,B
    where A.类别编号 = B.类别编号
    group by A.编号,A.姓名 
    order by A.编号,A.姓名drop table A,B/*
    编号          姓名         西药费                                     中药费                                     成药费                                     化验费                                     治疗费
    ----------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
    1           张和         120.02                                  0.00                                    0.00                                    0.00                                    220.00
    2           扬蓝         230.00                                  0.00                                    0.00                                    0.00                                    0.00
    4           李东         0.00                                    520.00                                  0.00                                    0.00                                    0.00
    6           何新         0.00                                    0.00                                    0.00                                    0.00                                    98.00(4 行受影响)
    */
      

  5.   

    create table A(编号 int, 姓名 varchar(10), 金额 decimal(18,2), 类别编号 varchar(10))
    insert into A values(1, '张和', 120.02, '01')
    insert into A values(2, '扬蓝', 230.00, '01')
    insert into A values(4, '李东', 520.00, '02')
    insert into A values(6, '何新', 98.00 , '05')
    insert into A values(1, '张和', 220.00, '05')
    create table B(类别编号 varchar(10), 类别名称 varchar(10),顺序号 int)
    insert into B values('01', '西药费', 1 )
    insert into B values('02', '中药费', 2 )
    insert into B values('03', '成药费', 3 )
    insert into B values('04', '化验费', 4 )
    insert into B values('05', '治疗费', 5 )
    go--静态SQL,指类别名称只有这五种。
    select A.编号,A.姓名,
      sum(case B.类别名称 when '西药费' then A.金额 else 0 end) '西药费',
      sum(case B.类别名称 when '中药费' then A.金额 else 0 end) '中药费',
      sum(case B.类别名称 when '成药费' then A.金额 else 0 end) '成药费',
      sum(case B.类别名称 when '化验费' then A.金额 else 0 end) '化验费',
      sum(case B.类别名称 when '治疗费' then A.金额 else 0 end) '治疗费'
    from A,B
    where A.类别编号 = B.类别编号
    group by A.编号,A.姓名 
    order by A.编号,A.姓名
    /*
    编号          姓名         西药费                                     中药费                                     成药费                                     化验费                                     治疗费
    ----------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
    1           张和         120.02                                  0.00                                    0.00                                    0.00                                    220.00
    2           扬蓝         230.00                                  0.00                                    0.00                                    0.00                                    0.00
    4           李东         0.00                                    520.00                                  0.00                                    0.00                                    0.00
    6           何新         0.00                                    0.00                                    0.00                                    0.00                                    98.00(4 行受影响)
    */--动态SQL,指类别名称不止这五种。
    declare @sql varchar(8000)
    set @sql = 'select A.编号,A.姓名'
    select @sql = @sql + ' , sum(case 类别名称 when ''' + 类别名称 + ''' then A.金额 else 0 end) [' + 类别名称 + ']'
    from (select distinct 类别名称 from B) as T
    set @sql = @sql + ' from A,B where A.类别编号 = B.类别编号 group by A.编号,A.姓名 order by A.编号,A.姓名'
    exec(@sql) 
    /*
    编号          姓名         成药费                                     化验费                                     西药费                                     治疗费                                     中药费
    ----------- ---------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
    1           张和         0.00                                    0.00                                    120.02                                  220.00                                  0.00
    2           扬蓝         0.00                                    0.00                                    230.00                                  0.00                                    0.00
    4           李东         0.00                                    0.00                                    0.00                                    0.00                                    520.00
    6           何新         0.00                                    0.00                                    0.00                                    98.00                                   0.00(4 行受影响)
    */drop table A,B
      

  6.   

    此例行列转换应使用sum,不应该使用max
      

  7.   


    此例行列转换应使用sum,不应该使用max
    -------------------------------
    那就看楼主的数据是怎么样的了``。目前给的max就可以了。上面忘了翻译类别编号了
    create table A(编号 int,姓名 varchar(10),金额 money,类别编号 varchar(10))
    insert into A select 1,'张和',120.02,'01'
    insert into A select 2,'扬蓝',230.00,  '01'
    insert into A select 4,'李东',520.00,  '02'
    insert into A select 6,'何新',  98.00,  '05'
    insert into A select 1,'张和',220.00,  '05'
    create table B(类别编号 varchar(10),类别名称 varchar(10),顺序号 int)
    insert into B select  '01',      '西药费',    1 
    insert into B select  '02',      '中药费',    2 
    insert into B select  '03',      '成药费',    3 
    insert into B select  '04',      '化验费',    4 
    insert into B select  '05',      '治疗费',    5 declare @sql varchar(8000)
    set @sql='select 编号,姓名'
    select @sql=@sql+',['+类别名称 +']=max(case b.类别名称 when '''+类别名称 +''' then cast(金额 as varchar) else ''0'' end)' from (select distinct 类别名称 from B)a
    set @sql=@sql+' from A,b where a.类别编号=b.类别编号 group by 编号,姓名 order by 编号'
    exec(@sql)