行列互换

 

use pubs
drop table t
drop table e

--行转列
create   table   t
(
      Name         varchar(10)   ,
      Subject   varchar(10)   ,
      Result     int
)

insert   into   t(Name   ,   Subject   ,   Result)   values( '张三 ', '语文 ', '73 ')
insert   into   t(Name   ,   Subject   ,   Result)   values( '张三 ', '数学 ', '83 ')
insert   into   t(Name   ,   Subject   ,   Result)   values( '张三 ', '物理 ', '93 ')
insert   into   t(Name   ,   Subject   ,   Result)   values( '李四 ', '语文 ', '74 ')
insert   into   t(Name   ,   Subject   ,   Result)   values( '李四 ', '数学 ', '83 ')
insert   into   t(Name   ,   Subject   ,   Result)   values( '李四 ', '物理 ', '93 ')

--不固定
 declare   @s   varchar(8000)  
  set   @s=''  
  select   @s=@s+', sum(case   Subject   when   '''+Subject+'''   then   Result   else   0   end)'   +Subject
  from   t  
  group   by   Subject  
  exec('select   姓名=Name'+@s+' ,合计=sum(Result)  
  from   #t  
  group   by   Name')  
  go
select * from t

--固定
select 姓名=Name,语文=isnull(sum(case Subject when '语文' then Result end),0),
    数学=isnull(sum(case Subject when '数学' then Result end),0),
    物理=isnull(sum(case Subject when '物理' then Result end),0),
    合计=isnull(sum(Result),0)
    from t
    group by Name
    order by Name

 


--列转行
create   table   e
(
      姓名   varchar(10)   ,
      语文   int   ,
      数学   int   ,
      物理   int
)

insert   into   e(姓名   ,   语文   ,   数学   ,   物理)   values( '张三 ',73,83,93)
insert   into   e(姓名   ,   语文   ,   数学   ,   物理)   values( '李四 ',74,84,94)

select * from e

select   姓名   as   Name, '语文 '   as   Subject,语文   as   Result   from   e   union
select   姓名   as   Name, '数学 '   as   Subject,数学   as   Result   from   e   union
select   姓名   as   Name, '物理 '   as   Subject,物理   as   Result   from   e
order   by   姓名   desc  

--其他
drop table test,T1
create table test([id] varchar(4), amount int, style varchar(20))

insert into test values('A1',500,'重不良')
insert into test values('A1',300,'中不良')
insert into test values('A1',150,'轻不良')
insert into test values('B1',300,'重不良')
insert into test values('B1',200,'轻不良')
insert into test values('B2',120,'轻不良')

select * from test

declare @sql varchar(8000)
set @sql='select [id], '
select @sql=@sql+quotename(style)+'=max(case when style='+quotename(style, '''')+' then rtrim(amount) else ''-'' end),' from test group by style
select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from test group by [id]'
exec(@sql)


create table T1(名字 varchar(10), 科目 varchar(10), 分数 int)
insert T1 select '1', '语文', 90
union all select '1', '数学', 80
union all select '2', '语文', 90
union all select '2', '数学', 85
union all select '2', '外语', 70

select * from T1

declare @sql varchar(8000)
declare @sql2 varchar(1000)
set @sql=''
set @sql2='總分='
select @sql=@sql+quotename(科目)+'=isnull( max(case when 科目='+quotename(科目, '''')+' then 分数 end), 100),',
@sql2=@sql2+'tmp.'+科目+'+'
from T1
group by 科目
select
@sql2=left(@sql2, len(@sql2)-1),
@sql=left(@sql, len(@sql)-1),
@sql='select tmp.*,'+@sql2+' from (select 名字,'+@sql,
@sql=@sql+' from T1 group by 名字) tmp'
exec(@sql)

 

--其他完整例

posted @ 2009-02-22 14:43  瑞君  Views(180)  Comments(0)    收藏  举报