您的位置:程序门 -> ms-sql server -> 应用实例



求一方法解决sql 行列转换


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求一方法解决sql 行列转换[已结贴,结贴人:lovejiao]
发表于:2007-09-11 21:23:48 楼主
假设有张学生成绩表(cj)如下
name       subject       result
张三       语文             80
张三       数学             90
张三       物理             85
李四       语文             85
李四       数学             92
李四       物理             82
想变成      
姓名       语文       数学       物理
张三       80             90           85
李四       85             92           82
发表于:2007-09-11 22:07:031楼 得分:4

create   table   suser

name char(10)
,subject   char(10)
,result     float
)

insert   suser
select   'zhang ', '语文 ', '70 '
union   all
select   'wang ', '语文 ', '60 '
union   all
select   'zhang ', '物理 ', '100 '
union   all
select   'wang ', '物理 ', '100 '
union   all
select   'zhang ', '化学 ', '100 '
union   all
select   'wang ', '化学 ', '100 '


select   name
, '物理 '=sum(case   subject   when   '物理 '   then   result   end)  
, '化学 '=sum(case   subject   when       '化学 '   then     (result)   end)
, '语文 '=sum(case   subject   when   '语文 'then   result   end)   from   suser   group   by   name
发表于:2007-09-11 22:12:172楼 得分:0
/*
limpire:
*/

--原始数据:#test
create   table   #test   (name   varchar(4),subject   varchar(4),result   int)
insert   #test
select   '张三 ', '语文 ',80   union   all
select   '张三 ', '数学 ',90   union   all
select   '张三 ', '物理 ',85   union   all
select   '李四 ', '语文 ',85   union   all
select   '李四 ', '数学 ',92   union   all
select   '李四 ', '物理 ',82

declare   @sql   varchar(8000)
select   @sql=coalesce(@sql+ ', ', ' ')+ '[ '+subject+ ']=sum(case   subject   when   ' ' '+subject+ ' ' '   then   result   end) '   from   #test   group   by   subject
set   @sql= 'select   姓名=name, '+@sql+ '   from   #test   group   by   name '

EXEC(@sql)
/*
姓名 数学 物理 语文
李四 92 82 85
张三 90 85 80
*/

--删除测试
drop   table   #test
发表于:2007-09-11 22:13:033楼 得分:5
select  
                name   as   姓名,
                sum(case   when   subject   =   '语文 '   then   result   else   0   end)   as   语文,
                sum(case   when   subject   =   '数学 '   then   result   else   0   end)   as   数学,
                sum(case   when   subject   =   '物理 '   then   result   else   0   end)   as   物理
from   cj
group   by   [name]
发表于:2007-09-11 22:13:334楼 得分:0
create   table   #cj   (name   varchar(100),subject   varchar(100),     result   int)

insert   into   #cj   select   '张三 ', '语文 ',80
insert   into   #cj   select   '张三 ', '数学 ',90
insert   into   #cj   select   '张三 ', '物理 ',85
insert   into   #cj   select   '李四 ', '语文 ',85
insert   into   #cj   select   '李四 ', '数学 ',92
insert   into   #cj   select   '李四 ', '物理 ',82


select  
                name   as   姓名,
                sum(case   when   subject   =   '语文 '   then   result   else   0   end)   as   语文,
                sum(case   when   subject   =   '数学 '   then   result   else   0   end)   as   数学,
                sum(case   when   subject   =   '物理 '   then   result   else   0   end)   as   物理
from   #cj
group   by   [name]


drop   table   #cj
发表于:2007-09-11 22:16:385楼 得分:15
/*
limpire:
*/

--原始数据:#test
create   table   #test   (name   varchar(4),subject   varchar(4),result   int)
insert   #test
select   '张三 ', '语文 ',80   union   all
select   '张三 ', '数学 ',90   union   all
select   '张三 ', '物理 ',85   union   all
select   '李四 ', '语文 ',85   union   all
select   '李四 ', '数学 ',92   union   all
select   '李四 ', '物理 ',82

declare   @sql   varchar(8000)
select   @sql=coalesce(@sql+ ', ', ' ')+ '[ '+subject+ ']=sum(case   subject   when   ' ' '+subject+ ' ' '   then   result   end) '   from   #test   group   by   subject
set   @sql= 'select   姓名=name, '+@sql+ '   from   #test   group   by   name '
print   @sql
EXEC(@sql)
/*
姓名 数学 物理 语文
李四 92 82 85
张三 90 85 80
*/

--直接法:如果subject是动态的不适合。
select   姓名=name,[语文]=sum(case   subject   when   '语文 '   then   result   end),[数学]=sum(case   subject   when   '数学 '   then   result   end),[物理]=sum(case   subject   when   '物理 '   then   result   end)   from   #test   group   by   name
/*
姓名 语文 数学 物理
李四 85 92 82
张三 80 90 85
*/

--删除测试
drop   table   #test
发表于:2007-09-11 22:59:376楼 得分:1
楼上正解
用动态sql
发表于:2007-09-12 08:17:587楼 得分:0
再问一个问题,,
我使用的win   2003   server   英文操作系统(打有中文语言包)
我在sql   server   2000中创建了linked   server   连接到远程的oracle服务器,(oracle   8i)  
然后在sql   查询分析器里利用select   *   from   openquery(test, 'selet   *   from   table1 ')对数据查询,但是查询结果中的中文全是乱码.这是为什么?
我客户端的字符集和数据库字符集一致
但是我查出来的全是乱码,,各位能否给个解决方案?谢谢
发表于:2007-09-12 08:48:428楼 得分:15
--和我整理的东西这么象?

普通行列转换

假设有张学生成绩表(t)如下

name   subject   result
张三   语文  73
张三   数学  83
张三   物理  93
李四   语文  74
李四   数学  84
李四   物理  94

想变成  
姓名   语文   数学   物理
张三   73  83  93
李四   74  84  94

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   @sql   varchar(8000)
set   @sql   =   'select   name   as   '   +   '姓名 '
select   @sql   =   @sql   +   '   ,   sum(case   subject   when   ' ' '   +   subject   +   ' ' '   then   result   end)   [ '   +   subject   +   '] '
from   (select   distinct   subject   from   #t)   as   a
set   @sql   =   @sql   +   '   from   #t   group   by   name '
EXEC(@sql)  

drop   table   #t

--结果
姓名               数学                 物理                 语文                    
----------   -----------   -----------   -----------  
李四               83                     93                     74
张三               83                     93                     73
 
----------------------------------------------------
如果上述两表互相换一下:即

姓名   语文   数学   物理
张三   73  83  93
李四   74  84  94

想变成  
name   subject   result
张三   语文  73
张三   数学  83
张三   物理  93
李四   语文  74
李四   数学  84
李四   物理  94

create   table   #t

      姓名   varchar(10)   ,
      语文   int   ,
      数学   int   ,
      物理   int
)

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

select   姓名   as   name, '语文 '   as   subject,语文   as   result   from   #t   union
select   姓名   as   name, '数学 '   as   subject,数学   as   result   from   #t   union
select   姓名   as   name, '物理 '   as   subject,物理   as   result   from   #t
order   by   姓名   desc  

drop   table   #t
 
--结果
name               subject   result            
----------   -------   -----------  
张三               数学         83
张三               物理         93
张三               语文         73
李四               数学         84
李四               物理         94
李四               语文         74

(所影响的行数为   6   行)
发表于:2007-09-12 08:50:419楼 得分:8
if   exists   (select   name   from   tempdb.dbo.sysobjects   where   id=object_id( 'tempdb..#test '))
drop   table   #test

create   table   #test   (name   varchar(40),subject   varchar(40),result   int)
insert   #test
select   n '张三 ',n '语文 ',80   union   all
select   n '张三 ',n '数学 ',90   union   all
select   n '张三 ',n '物理 ',85   union   all
select   n '李四 ',n '语文 ',85   union   all
select   n '李四 ',n '数学 ',92   union   all
select   n '李四 ',n '物理 ',82


declare   @str   varchar(2000)
set   @str= ' '

select   @str=@str+ ',max(case   when   subject= '+ ' ' ' '+subject+ ' ' ' '+ '   then   result   else   null   end   )   as   '+ ' ' ' '+subject+ ' ' ' '   from
#test   group   by   subject


set   @str= 'select   name '+@str+ '   from   #test   group   by   name '

EXEC(@str)
发表于:2007-09-12 08:53:4110楼 得分:0
再问一个问题,,
我使用的win   2003   server   英文操作系统(打有中文语言包)
我在sql   server   2000中创建了linked   server   连接到远程的oracle服务器,(oracle   8i)
然后在sql   查询分析器里利用select   *   from   openquery(test, 'selet   *   from   table1 ')对数据查询,但是查询结果中的中文全是乱码.这是为什么?
我客户端的字符集和数据库字符集一致
但是我查出来的全是乱码,,各位能否给个解决方案?谢谢

-----------------------------

将英文操作系统的中文设成默认
发表于:2007-09-12 10:43:2111楼 得分:0
dawugui(潇洒老乌龟)   (   )   信誉:100     2007-09-12   08:48:42     得分:   0    
      --和我整理的东西这么象?
-------------------------------------------------------------------------------
老龟,什么意思??两个人整理的东西不可以有相同类型的??
虽然我是刚接触程序整理点资料无可厚非啊,
发表于:2007-09-12 10:45:0012楼 得分:0
我是说,和我整理的这么象,不用思考,直接帖出来给你.
发表于:2007-09-12 22:25:2013楼 得分:1
哎...楼主冤枉好人啦
发表于:2007-09-13 09:49:2514楼 得分:1
自己去搜索一下啦,这种贴好多的
发表于:2007-09-14 08:13:4515楼 得分:0

dawugui(潇洒老乌龟)   (   )   信誉:100     2007-9-12   10:45:01     得分:   0      
我是说,和我整理的这么象,不用思考,直接帖出来给你.
-------------------------------------------------------------------------------
sorry!
   
 
发表于:2008-01-04 17:01:1916楼 得分:0
兄弟们啊。有没有oracle的解决方案啊。动态sql


快速检索

最新资讯
热门点击