CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

高分求教简单的SQL语句,顶者有分!

楼主progra(不学无数又富于幻想的人,虽有翅膀却无双脚)2005-07-14 09:03:48 在 MS-SQL Server / 基础类 提问

SQL   Server:  
  表结构:  
              ID(编号),Name(XX名称)  
  在表中有如下数据:  
              1,A客户  
              1,B供应商    
              2,C客户  
              2,D供应商  
  问题-通过视图生成如下表结构:  
            1,A客户,B供应商  
            2,C客户,D供应商  
  即:把表中ID相同的两条记录合并为一条记录。 问题点数:100、回复次数:56Top

1 楼mengzulin(Julian)回复于 2005-07-14 09:12:14 得分 3

create         FUNCTION   dbo.getPlus(@ID   int)  
  RETURNS   varchar(800)  
  AS  
  BEGIN  
  DECLARE   @str   varchar(800)  
  set     @str=''  
  SELECT   @str=@str+rtrim(Name)+','  
  FROM   [dbo].[tablename]  
  where   ID   =   @ID  
  order   by   str_ID  
  return   @str  
  END  
   
  select   [ID],getPlus(ID)   from   [table]Top

2 楼wpmxm(老三)回复于 2005-07-14 09:15:34 得分 3

select   id,name,f_getclient(id)   from   table_name   where   name   like   '%客户%'   order   by   id    
  自定义函数:  
  create   function   f_getclient(@id   int   )return   varchar(50)   as  
  begin    
  declare   @clientname   varchar(50)  
  select   @clientname   =name   from   table_name   where   id   =@id   and   name   like   '%供应商%'  
  return   @clientname  
  endTop

3 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-14 09:19:28 得分 3

--建立测试环境  
  Create   Table   TEST  
  (ID Int,  
    Name Nvarchar(20))  
  Insert   TEST   Values(1,N'A客户')  
  Insert   TEST   Values(1,N'B供应商')    
  Insert   TEST   Values(2,N'C客户')  
  Insert   TEST   Values(2,N'D供应商')  
  GO  
  --建立函数  
  Create   Function   GetName(@ID   Int)  
  Returns   Nvarchar(1000)  
  As  
  Begin  
          Declare   @S   Nvarchar(1000)  
          Set   @S=''  
          Select   @S=@S+','+Name   from   TEST     Where   ID=@ID   Order   By   Name  
          Return   (Stuff(@S,1,1,''))  
  End  
  GO  
  --测试  
  Select   ID,dbo.GetName(ID)   As   Name   from   TEST   Group   By   ID  
  GO  
  --删除测试环境  
  Drop   Table   TEST  
  Drop   Function   GetName  
  --结果  
  /*  
  ID Name  
  1 A客户,B供应商  
  2 C客户,D供应商  
  */  
  Top

4 楼hsj20041004(光芒)回复于 2005-07-14 09:22:19 得分 3

create   table   tb(id   int,name   varchar(10))  
  insert   into   tb   select   1,'A客户'  
  union   select   1,'B供应商'  
  union   select   2,'C客户'      
  union   select   2,'D供应商'      
   
   
   
  create         FUNCTION   dbo.getname(@as_ID   int)  
  RETURNS   varchar(1000)  
  AS  
  BEGIN  
  DECLARE   @str   varchar(1000)  
  set     @str=''  
  SELECT   @str=@str+','+rtrim(Name)  
  FROM     tb  
  where   ID   =   @as_ID  
  return   stuff(@str,1,1,'')  
  END  
   
  select   [ID],dbo.getname(ID)   from   tb   group   by   id  
  结果:  
  ID                                                                                      
  -----------   -----------------------------------------------------------------------------    
  1                       A客户,B供应商  
  2                       C客户,D供应商  
   
  (所影响的行数为   2   行)Top

5 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-14 09:22:34 得分 0

一二楼的都是错误的。Top

6 楼wangdehao(找找找(现在很幸福))回复于 2005-07-14 09:25:52 得分 3

create         FUNCTION   dbo.getPlus(@ID   int)  
  RETURNS   varchar(800)  
  AS  
  BEGIN  
  DECLARE   @str   varchar(800)  
  set     @str=''  
  SELECT   @str=@str+','+ltrim(rtrim(Name))  
  FROM   [dbo].[tablename]  
  where   ID   =   @ID  
  order   by   str_ID  
  set   @str=stuff(@str,1,1,'')  
  return   @str  
  END  
   
  select   [ID],getPlus(ID)   from   [table]  
   
  ---没测试  
  Top

7 楼qiuzhong1983(老丘)回复于 2005-07-14 09:32:23 得分 2

路过。Top

8 楼sxycgxj(云中客)回复于 2005-07-14 09:39:02 得分 2

鱼的方法可以Top

9 楼hglhyy(為人民币服务!)回复于 2005-07-14 09:44:56 得分 3

 
  create   table     tab([id]   char(1000),[name]   char   (1000))  
        insert   into   tab  
  select   '1','A客户'   union   all  
  select   '1','B供应商'   union   all  
  select   '2','C客户'   union   all  
  select   '2','D供应商'  
   
             
   
   
  CREATE         FUNCTION   dbo.get123(@ID   int)  
  RETURNS   varchar(1000)  
  AS  
  BEGIN  
  DECLARE   @a   varchar(1000)  
  set     @a=''  
  SELECT   @a=@a+','+rtrim([Name])  
  FROM     tab  
  where   [ID]   =   @ID  
  return   stuff(@a,1,1,'')  
  END  
   
  select   [ID],dbo.get123(ID)   from   tab   group   by   [id]  
   
  --  
   
  ID            
  ------------------   ----------    
  1                                       A客户,B供  
  2                                       C客户,D供  
   
  (所影响的行数为   2   行)  
  Top

10 楼hglhyy(為人民币服务!)回复于 2005-07-14 09:45:58 得分 2

真快! 简直是在抢啊Top

11 楼gimy007(逮猫的耗子)回复于 2005-07-14 09:49:26 得分 2

呵呵,俺来骗分的Top

12 楼lanbaibai(蓝白白)回复于 2005-07-14 09:50:15 得分 2

是的,看来高手太多了Top

13 楼xuelanghun(雪狼魂)回复于 2005-07-14 09:56:09 得分 2

upTop

14 楼xiaoxiangqing(肖祥清)回复于 2005-07-14 09:56:29 得分 3

if   exists(select   1   from   sysobjects   where   name='temp'   and   type='u')  
  drop   table   temp  
   
  if   exists(select   1   from   sysobjects   where   name='temp_view'   and   type='v')  
  drop   view   temp_view  
   
  if   exists(select   1   from   sysobjects   where   name='uf_temp'   and   type='FN')  
  drop   function   uf_temp  
  go  
   
  create   table   temp(id   int,name   varchar(20))  
  go  
   
  create   function   dbo.uf_temp(@id   int)  
  returns   varchar(1000)  
  as  
  begin  
  declare   @str   varchar(1000)  
  set   @str=''  
  select   @str=@str+','+name   from   temp   where   id=@id  
  if   @str<>''  
  set   @str=right(@str,len(@str)-1)  
  return   @str  
  end  
   
  go  
   
   
  insert   into   temp  
  select   1,'A客户'   union  
  select   1,'B供应商'   union  
  select   2,'C客户'   union  
  select   2,'D供应商'    
   
  go  
   
  select   *   from   temp  
  go  
  /*  
  id             name  
  1 A客户  
  1 B供应商  
  2 C客户  
  2 D供应商  
   
  */  
   
  --select   id   from   temp   group   by   id  
  create   view   temp_view    
  as  
  select   id,dbo.uf_temp(id)   name   from   temp   group   by   id  
  go  
   
  select   *   from   temp_view  
  /*  
  id                     name  
  1 A客户,B供应商  
  2 C客户,D供应商  
   
  */  
  Top

15 楼gimy007(逮猫的耗子)回复于 2005-07-14 09:56:39 得分 3

看了上面的自定义函数,提个小问题:  
   
  由于是Order   By   Name来排序的,那有没可能出现这样的结果呢?如:  
   
  1                       A客户,B供应商  
  2                       D供应商,C客户  
   
  这可能不符合实际的要求~~Top

16 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 09:57:55 得分 0

各位,我们为了数据库移植的考虑,不能使用存储过程,函数等,只能使用视图Top

17 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 10:00:23 得分 0

各位有没有不用函数,只有视图的方法Top

18 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 10:03:47 得分 0

1,A客户,B供应商  
            2,C客户,D供应商     意识是     ID,AName,BName  
                                                                1,A客户,B供应商  
                                                                2,C客户,D供应商Top

19 楼phantomMan()回复于 2005-07-14 10:20:56 得分 3

因为你上面的表结构没有关键字段,所以可以使用临时表;  
  但是无法在视图中使用临时表,这里仅做参考:  
   
  create   table   #t(Pid   int   identity,id   int,name   varchar(100))  
   
  insert   into   #t   select   *   from   tb  
   
  select   a.id,a.name,b.name    
  from   #t   a,#t   b  
  where   a.id=b.id   and   a.name<>b.name   and   a.Pid%2=1  
   
  drop   table   #t  
  Top

20 楼KENJACK(心忆寒)回复于 2005-07-14 11:41:02 得分 2

就   为   了顶也有分Top

21 楼Yisa()回复于 2005-07-14 12:17:50 得分 2

真热闹,   高手们继续啦.  
  关注中....  
  Top

22 楼hemingliang()回复于 2005-07-14 12:28:17 得分 2

关注...........Top

23 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 12:32:02 得分 0

还是只用视图来实现的方法  
  生成的视图结构是:ID,AName,BName   即   1,A客户,B供应商   对应三列!  
   
  比较急~  
   
  Top

24 楼mengzulin(Julian)回复于 2005-07-14 12:39:20 得分 3

create         FUNCTION   dbo.getPlus(@ID   int)  
  RETURNS   varchar(800)  
  AS  
  BEGIN  
  DECLARE   @str   varchar(800)  
  set     @str=''  
  SELECT   @str=@str+rtrim(Name)+','  
  FROM   [dbo].[tablename]  
  where   ID   =   @ID  
  order   by   ID  
  return   @str  
  END  
   
  select   [ID],getPlus(ID)   from   [table]Top

25 楼rockyljt(江濤)回复于 2005-07-14 12:42:04 得分 2

upTop

26 楼vivianfdlpw()回复于 2005-07-14 12:50:03 得分 5

如果每个ID仅对应两个纪录:  
  --建立测试环境  
  if   exists(select   1   from   sysobjects   where   id=object_id('A')   and   xtype='U')  
  drop   table   A  
  go  
  create   table   A  
  (  
    ID   Int,  
    Name   nvarchar(20)  
  )  
  insert   A   values(1,N'A客户')  
  insert   A   values(1,N'B供应商')    
  insert   A   values(2,N'C客户')  
  insert   A   values(2,N'D供应商')  
  go  
   
  --创建视图  
  if   exists(select   1   from   sysobjects   where   id=object_id('v')   and   xtype='V')  
  drop   view   v  
  go  
  create   view   v  
  as  
  select   T1.ID,[Name]=T2.name+','+T1.name    
  from    
          (select   ID,[Name]=max(name)   from   A   group   by   ID)T1    
          join    
          (select   ID,[Name]=min(name)   from   A   group   by   ID)T2    
          on   T1.ID=T2.ID  
   
  go    
   
  --查看  
  select   *   from   v  
   
  --删除测试环境  
  drop   table   A  
  drop   view   v  
   
  --结果  
  /*  
   
   
  ID                     Name                                                                              
  -----------   -----------------------------------------    
  1                       A客户,B供应商  
  2                       C客户,D供应商  
   
  (所影响的行数为   2   行)  
  */  
  Top

27 楼jixiaojie(太多借口)回复于 2005-07-14 12:55:08 得分 5

--有点牵强  
   
   
   
  create   table   temp(id   int,name   varchar(20))  
   
  insert   into   temp  
  select   1,'A客户'   union  
  select   1,'B供应商'   union  
  select   2,'C客户'   union  
  select   2,'D供应商'    
   
  go  
   
  create   view   tempview    
   
  as  
   
  select   t1.id,t1.name   aname   ,t2.name   bname  
  from    
  (select   *   from   temp  
  where   name   like   '%客户'  
  )t1  
  join    
  (select   *   from   temp  
  where   name   like   '%供应商'  
  )t2  
  on   t1.id   =t2.id  
   
   
  go  
   
  select   *   from   tempview  
   
  drop   table   temp  
  drop   view   tempview  
   
  /*  
   
  1 A客户 B供应商  
  2 C客户 D供应商  
  */Top

28 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 16:37:39 得分 0

to   vivianfdlpw():  
        三列啊~Top

29 楼tntzbzc(华裔大魔王—抗日要从娃娃抓起)回复于 2005-07-14 16:51:49 得分 2

select   a.id,a.name,b.name   from   tb   a   left   join   tb   b   on   a.id=b.id   and   a.name<>b.name   where   right(a.name,2)='客户'   and   right(b.name,3)='供应商'Top

30 楼vivianfdlpw()回复于 2005-07-14 17:11:31 得分 5

如果每个ID仅对应两个纪录:  
   
  --建立测试环境  
  if   exists(select   1   from   sysobjects   where   id=object_id('A')   and   xtype='U')  
  drop   table   A  
  go  
  create   table   A  
  (  
    ID   Int,  
    Name   nvarchar(20)  
  )  
  insert   A   values(1,N'A客户')  
  insert   A   values(1,N'B供应商')    
  insert   A   values(2,N'C客户')  
  insert   A   values(2,N'D供应商')  
  go  
   
  --创建视图  
  if   exists(select   1   from   sysobjects   where   id=object_id('v')   and   xtype='V')  
  drop   view   v  
  go  
  create   view   v  
  as  
  select   T1.ID,[Name1]=T2.name,[Name2]=T1.name    
  from    
          (select   ID,[Name]=max(name)   from   A   group   by   ID)T1    
          join    
          (select   ID,[Name]=min(name)   from   A   group   by   ID)T2    
          on   T1.ID=T2.ID  
   
  go    
   
  --查看  
  select   *   from   v  
   
  --删除测试环境  
  drop   table   A  
  drop   view   v  
   
  --结果  
  /*  
   
   
   
  ID                     Name1                                 Name2                                  
  -----------   --------------------   --------------------    
  1                       A客户                                     B供应商  
  2                       C客户                                     D供应商  
   
  (所影响的行数为   2   行)  
  */  
  Top

31 楼Yisa()回复于 2005-07-14 17:27:36 得分 3

試下面的語句,可以滿足樓主的要求.  
  create   view     view1  
  as  
  select   a.id,   min(a.name)   name1,   max(b.name)   name2  
  from   table   a   inner   join   (select   *   from   table)   b     on     a.id=b.id  
  group   by   a.id  
  go              
   
  Top

32 楼spdogntit(sp)回复于 2005-07-14 17:28:33 得分 1

up  
  Top

33 楼StarsRiver(学无止境)回复于 2005-07-14 21:47:03 得分 1

学习  
  Top

34 楼superqi1106(小琦)回复于 2005-07-14 21:54:56 得分 1

我也学习     呵呵   不错Top

35 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-07-14 22:26:46 得分 2

TO:   paoluo(一天到晚游泳的鱼)  
  好像樓主不是那個意思  
  我的理解是  
  ID   客戶       供应商  
  1     A客户     B供应商  
  2     C客户     D供应商  
   
  不知道是不是這個意思  
  Top

36 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-07-14 22:28:53 得分 1

好久沒有上SQL了  
  最近一個多月的工作實豐是太忙了。  
  Top

37 楼xiaonvjing(飞扬)回复于 2005-07-15 06:12:49 得分 5

 
  ---建立测试环境:  
   
  create   table   table1(id   int,name   varchar(10))  
  insert   into   table1   select   1,'A客户'  
  union   select   1,'B供应商'  
  union   select   2,'C客户'      
  union   select   2,'D供应商'      
   
  select   *   from   table1  
  ---创建满足条件的视图  
   
  create   view   a    
  as    
  select   a.id   id   ,min(a.name)   aname,b.name   bname   from   table1   a    
  join   (select   id,max(name)name   from   table1   group   by   id   )b    
  on   a.id=b.id     group   by   a.id,b.name  
   
  ----显示所需的数据  
  select   *   from   a    
   
   
   
  Top

38 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-15 09:29:36 得分 2

回复人:   Hopewell_Go(好的在后頭﹗希望更好﹗﹗)   (   )   信誉:98     2005-07-14   22:26:00     得分:   0      
     
     
        TO:   paoluo(一天到晚游泳的鱼)  
  好像樓主不是那個意思  
  我的理解是  
  ID   客戶       供应商  
  1     A客户     B供应商  
  2     C客户     D供应商  
   
  不知道是不是這個意思  
   
       
     
  --------------  
  是,楼主是这个意思。  
   
  只是他开始那样写的,大家都误会了。Top

39 楼jamex(1 + 1 = 爱)回复于 2005-07-15 10:19:04 得分 2

 
  正确答案来了:  
   
  select   a.[ID],   [ProviderName],[ClientName]    
  Form   (  
  Select   [ID],[Name]   as   [ProviderName]   from   [table]   where   [Name]   like   '%供应商%'  
  )   as   a  
  Inner   Join  
  (  
  Select   [ID],[Name]   as   [ClientName]   from   [table]   where   [Name]   like   '%客户%'  
  )   as   b  
  on   a.[ID]=b.[ID]  
  Order   by   a.[ID]Top

40 楼mrjerrylin(求知)回复于 2005-07-15 10:51:55 得分 1

顶Top

41 楼booby_fly(飞无止境)回复于 2005-07-15 11:11:10 得分 1

 
  学习Top

42 楼bluebirdme(烈焰あ寒星)回复于 2005-07-15 11:17:57 得分 1

飘过   ~~~~Top

43 楼netsapper(网络工兵)回复于 2005-07-15 12:52:44 得分 1

都答完了啊~~~Top

44 楼mengjuezhuren(梦觉主人)回复于 2005-07-15 13:04:56 得分 1

学习ING。。  
  Top

45 楼realjia(阿字良博)回复于 2005-07-15 13:10:40 得分 1

up,up……Top

46 楼ashei(老道)回复于 2005-07-15 13:20:35 得分 1

这才是正解  
  select   id,min(name),max(name)   from   table1   group   by   id  
   
  ,简单明了.反正楼主要求的视图只两列,正好一个max一个minTop

47 楼fox_xk(天使的歌)回复于 2005-07-15 13:24:17 得分 1

就是要   顶也有分Top

48 楼ashei(老道)回复于 2005-07-15 13:26:01 得分 1

如果要求一列客户一列供应商可以这样写  
  select   id,  
  (select   top   1   name   from   table1   a   where   a.id=b.id   and   a.name   like   '%客户%'),  
  (select   top   1   name   from   table1   a   where   a.id=b.id   and   a.name   like   '%供应商%')  
   
    from   table1   b   group   by   idTop

49 楼ainterpol(猪都会的二进制-吃饭-睡觉)回复于 2005-07-15 13:52:14 得分 0

晚来了   不用我做啦Top

50 楼chenyuanzhong(阿肉)回复于 2005-07-15 16:43:39 得分 0

顶也有分。那就混点分了撒Top

51 楼shilei831115(柔石)回复于 2005-07-15 17:38:16 得分 0

顶也有分Top

52 楼netfloator(Adam Lee)回复于 2005-07-15 21:36:10 得分 2

哈哈!向不拿分都不行了!  
  我这个最简单,楼主一定要多给分哦!  
   
   
  create   table   custum(cid   int,cname   varchar(20))  
  go  
  insert   into   custum   values   (1,'a')  
  insert   into   custum   values   (1,'b')  
  insert   into   custum   values   (2,'c')  
  insert   into   custum   values   (2,'d')  
  go  
  select   A.cid   cust_ID,A.cname   NAME1,B.cname   NAME2   from   custum   A,custum   B   where   A.cid=B.cid   and   A.cname<>B.cname    
  and   A.cname=(select   top   1   C.cname   from   custum   C   where   C.cid=A.cid)  
  go  
  drop   table   custum  
  go  
   
   
   
   
   
   
  cust_ID           NAME1                                 NAME2                                  
  -----------   --------------------   --------------------    
  1                       a                                         b  
  2                       c                                         dTop

53 楼netfloator(Adam Lee)回复于 2005-07-15 21:38:09 得分 1

不好意思,刚刚搞错了,不过只要把查询放到创建视图的语句中去就行了!Top

54 楼netfloator(Adam Lee)回复于 2005-07-15 21:41:36 得分 1

我想这个a客户,b供应商只是代名词吧,可以是任意的,只是要求每个id的第一个为客户,第二个为供应商。Top

55 楼filebat(Mark)回复于 2005-07-15 21:43:25 得分 1

楼主,怎么还不结帖啊.  
   
  热得不行了.  
   
  要换点新鲜血液才行啊.  
   
  大家不要老在一个老问题的纠缠啊.Top

56 楼brother2605(幽灵)回复于 2005-07-16 10:56:59 得分 1

up   学习啊Top

相关问题

  • 简单的sql语句,马上给分!!!
  • 高分求超简单SQL语句!
  • SQL语句,简单问题100分
  • 100分求简单的SQL语句
  • 50分求一简单SQL语句
  • 高分100求一简单SQL语句
  • 高分100求一简单SQL语句
  • 一简单SQL语句,100分奉上
  • 一简单SQL语句,100分奉上
  • 100分求一简单SQL语句

关键词

  • 客户
  • 视图
  • 函数
  • view
  • 测试
  • 供应商
  • custum
  • getplus
  • asbegindeclare
  • cname

得分解答快速导航

  • 帖主:progra
  • mengzulin
  • wpmxm
  • paoluo
  • hsj20041004
  • wangdehao
  • qiuzhong1983
  • sxycgxj
  • hglhyy
  • hglhyy
  • gimy007
  • lanbaibai
  • xuelanghun
  • xiaoxiangqing
  • gimy007
  • phantomMan
  • KENJACK
  • Yisa
  • hemingliang
  • mengzulin
  • rockyljt
  • vivianfdlpw
  • jixiaojie
  • tntzbzc
  • vivianfdlpw
  • Yisa
  • spdogntit
  • StarsRiver
  • superqi1106
  • Hopewell_Go
  • Hopewell_Go
  • xiaonvjing
  • paoluo
  • jamex
  • mrjerrylin
  • booby_fly
  • bluebirdme
  • netsapper
  • mengjuezhuren
  • realjia
  • ashei
  • fox_xk
  • ashei
  • netfloator
  • netfloator
  • netfloator
  • filebat
  • brother2605

相关链接

  • SQL Server类图书

广告也精彩

反馈

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