CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

关于表转换的存储过程

楼主luoye2002(落叶2002)2005-01-12 15:17:31 在 MS-SQL Server / 应用实例 提问

怎样把表  
  201     2  
  202     2  
  301     3  
  302     3  
  401     4  
  402     4  
  改成  
  2     201,202  
  3     301,302  
  4     401,402  
   
  201,202放在一个字段里  
  急,谢谢!  
   
  问题点数:100、回复次数:12Top

1 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:22:27 得分 0

create   function   c_str(@col1)  
  returns   varchar(1000)  
  as  
  begin  
        declare   @s   varchar(1000)  
        set   @s=''  
        select   @s=@s+','+col1   from   表   where   col2=@col2  
        return   stuff(@s,1,1,'')  
  end  
  --查询  
  select   col2,dbo.c_str(col2)   from   表   group   by   col1Top

2 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:25:48 得分 0

如果每组只有2个数据,就这样  
   
  select   a.id,a.col1+','+b.col1  
  from   表   a   inner   join   表   b   on   a.col2=b.col2    
                  and   a.col1=(select   top   1   col1   from   表   where   col2=a.col2)    
                  and   a.col1<>b.col1  
  Top

3 楼LBYYBL(o_o)回复于 2005-01-12 15:30:02 得分 0

--创建合并函数  
  create   function   testfun(@id   varchar(10))  
  returns   varchar(8000)  
  as  
  begin  
  declare   @str   varchar(8000)  
  set   @str=''  
  select   @str=@str+','+cast(a   as   nvarchar(10))   from   t   where   b=@id  
  set   @str=right(@str,len(@str)-1)  
  return(@str)  
  End  
  go  
  --创建表,并输入测试数据  
  create   table   t(a   int,b   int)  
  insert   into   t   select   201,     2  
  insert   into   t   select   202,     2  
  insert   into   t   select   301,     3  
  insert   into   t   select   302,     3  
  insert   into   t   select   401,     4  
  insert   into   t   select   402,     4  
  --sql语句  
  select   distinct   b   ,dbo.testfun(b)   as   a   from   t  
  --删除测试表  
  drop   table     t  
  --删除合并函数  
  drop   function   testfun  
   
   
   
  Top

4 楼zjcxc(邹建)回复于 2005-01-12 15:30:24 得分 0

--如果每组只有两个数据,可以用  
  select   字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))  
  from   表   group   by   字段b  
   
  --如果生成的结果是三列  
  select   字段b,min(字段a),max(字段a)  
  from   表   group   by   字段bTop

5 楼zjcxc(邹建)回复于 2005-01-12 15:30:39 得分 0

--如果每组只有两个数据,可以用  
   
  select   字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))  
  from   表   group   by   字段b  
   
  Top

6 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:32:04 得分 0

改一点  
   
  create   function   c_str(@col2)  
  returns   varchar(1000)  
  as  
  begin  
        declare   @s   varchar(1000)  
        set   @s=''  
        select   @s=@s+','+col1   from   表   where   col2=@col2  
        return   stuff(@s,1,1,'')  
  end  
  --查询  
  select   col2,dbo.c_str(col2)   from   表   group   by   col2  
  Top

7 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:32:49 得分 0

zjcxc(邹建)    
   
  --如果每组只有两个数据,可以用  
   
  select   字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))  
  from   表   group   by   字段b  
   
   
  这个好  
  Top

8 楼luoye2002(落叶2002)回复于 2005-01-12 16:09:20 得分 0

to   lbyybl:我   的   这个表也是   也是通过select出来的,a是通过函数出来的语句如下(select   room.roomno+','+     dbo.nulltoO(room.cleanstatus,room.inroomflag)+':'   房间状态,room.level   from   room    
  left   join   (select   status,roomno,hotelcode   from   roomoccupy  
  where   status   not   in   ('C')    
  group   by   roomno,hotelcode,status)   Occ    
  on   Room.roomno=Occ.roomno  
  where   guestroomid=1   order   by   room.roomno   )  
  请问怎么套用你   的   函数?谢谢!Top

9 楼zjcxc(邹建)回复于 2005-01-12 16:23:28 得分 100

--那就用临时表  
   
  select   cast(  
  room.roomno  
  +','+dbo.nulltoO(room.cleanstatus,room.inroomflag)  
  +':'   as   varchar(8000))   房间状态  
  ,room.level    
  into   #t   from   room    
  left   join   (select   status,roomno,hotelcode   from   roomoccupy  
  where   status   not   in   ('C')    
  group   by   roomno,hotelcode,status  
  )   Occ   on   Room.roomno=Occ.roomno  
  where   guestroomid=1   order   by   room.roomno  
   
  declare   @level   int,@r   varchar(8000)  
  update   #t   set   @r=case   when   @level=level   then   @r+','+房间状态   else   房间状态   end  
  ,房间状态=@r,@level=level  
  select   房间状态=max(房间状态),level   from   #t   group   by   level  
  select   *   from   #t  
  drop   table   #tTop

10 楼luoye2002(落叶2002)回复于 2005-01-12 17:23:42 得分 0

谢谢各位!to   zjcxc:能不能解释一下update   #t   set   @r=case   when   @level=level   then   @r+','+房间状态   else   房间状态   end  
  ,房间状态=@r,@level=level,谢谢!Top

11 楼zjcxc(邹建)回复于 2005-01-12 19:53:26 得分 0

你把它理解成游标,逐条处理就行了Top

12 楼luoye2002(落叶2002)回复于 2005-01-14 13:42:27 得分 0

select   房间状态=max(房间状态),level   from   #j   group   by   level  
  什么   意思?Top

相关问题

  • 把一个表的行列转换的存储过程怎么写
  • interbase的存储过程转换为MSSQL的存储过程.
  • 表一存储过程
  • 请教转换sql存储过程
  • interbase的存储过程转换为MSSQL的存储过程第二个...
  • interbase的存储过程转换为MSSQL的存储过程最后一个了...
  • 考考大家,怎么把下面的ms sql存储过程转换为对应的oracle里面的表达
  • 存储过程怎样返回表集
  • 如何用存储过程创建表
  • interbase下如何建表,存储过程???

关键词

  • 字段
  • 数据
  • roomno
  • col
  • 房间状态
  • testfun
  • 表
  • room
  • level
  • 每组

得分解答快速导航

  • 帖主:luoye2002
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo