求一个SQL替换语句,请高手帮忙!在线等!

时间:2021-12-29 21:55:19
本人有一个表,内容如下
  序号         名称        费用         信息
 20012312     4545445      10        府前街10号
 20012312     yysdf        20        府前街10号
 20012333     4525423      600       国良路30号
 20012324     5264125      501       南京路
 20012324     dd52241      500       胜利路dsaf
 20015241     2323223      100       南开大学
据上表可以看出同一个序号里可能会包括多个名称(至少两个或更多未全部列出),但也有一个序号里一个名称的,我想做的就是把序号一样的列的名称统一起来,比如第一二行,我想让一行的数字来替换二行的字母,只要是一样的序号我就让她自动选取和他一样的序号的数字名称来替换非数字名称,我该怎么写这条语句呢?谢谢各位,在线等!

8 个解决方案

#1


select 序号,名称,费用,信息
from tablename
where 序号+名称 in 
(
select 序号+max(名称) from tablename
group by 序号
)

#2


仁兄谢谢你的热情,我试过了,你的语句不能实现我的操作,我想要的结果是这样的,
序号         名称        费用         信息
 20012312     4545445      10        府前街10号
 20012312     4545445      20        府前街10号
 20012333     4525423      600       国良路30号
 20012324     5264125      501       南京路
 20012324     5264125      500       胜利路dsaf
 20015241     2323223      100       南开大学

还请大家继续想法帮帮我!

#3


自已顶一下

#4


--创建测试环境
create table #
(
  [序号] varchar(20),
  [名称] varchar(20),
  [费用] money,
  [信息] varchar(200)
)
insert #
select '20012312','4545445',10,'府前街10号' union
select '20012312','yysdf',20,'府前街10号' union
select '20012333','4525423',600,'国良路30号' union
select '20012324','5264125',501,'南京路' union
select '20012324','dd52241',500,'胜利路dsaf' union
select '20015241','2323223',100,'南开大学'
--测试
update # set [名称]=A.[名称] 
from # B
join (select [序号],[名称] from # where patindex('%[a-z]%',[名称])=0)A
on A.[序号]=B.[序号]

-- 查看
select * from #

--删除测试环境
drop table #

--结果
/*

序号                   名称                   费用                    信息   
-------------------- -------------------- --------------------- ------------
20012312             4545445              10.0000               府前街10号
20012312             4545445              20.0000               府前街10号
20012324             5264125              501.0000              南京路
20012324             5264125              500.0000              胜利路dsaf
20012333             4525423              600.0000              国良路30号
20015241             2323223              100.0000              南开大学

*/

#5


你测试一下,我没有数据测试:

select 序号,
case when t1.名称>t2.名称 then t2.名称 else  t1.名称 end as 名称,费用,信息 
from tablename t1 left join tablename t2 on t1.序号=t2.序号 and t1.名称=t2.名称
where t1.名称<>t2.名称


#6


--创建测试数据
create table bb ([id] varchar(50),[name] varchar(50),past int,info varchar(50))
insert bb select '20012312','4545445',10,'府前街10号'
union all select '20012312','yyasdf',20,'府前街10号'
union all select '20012333','4525423',600,'国良路30号'
union all select '20012324','5264125',501,'南京路'
union all select '20012324','dd52241',500,'胜利路dsaf'
union all select '20015241','2323223',100,'南开大学'
--测试
update bb set name=(select top 1 name from bb aa where aa.id=bb.id )
--删除测试数据
drop table bb

#7


拉倒抛砖引玉:
select a.序号,a.名称,b.费用,b.信息 from tablename a left join tablename b on a.序号=b.序号 where a.名称<=(select min(名称) from tablename where 序号=a.序号)
结果如下
20012312 4545445 10.0000 府前街10号
20012312 4545445 20.0000 府前街10号
20012324 5264125 501.0000 南京路
20012324 5264125 500.0000 胜利路dsaf
20012333 4525423 600.0000 国良路30号
20015241 2323223 100.0000 南开大学

#8


应该满足了cncfish (独行天下) 的要求!

#1


select 序号,名称,费用,信息
from tablename
where 序号+名称 in 
(
select 序号+max(名称) from tablename
group by 序号
)

#2


仁兄谢谢你的热情,我试过了,你的语句不能实现我的操作,我想要的结果是这样的,
序号         名称        费用         信息
 20012312     4545445      10        府前街10号
 20012312     4545445      20        府前街10号
 20012333     4525423      600       国良路30号
 20012324     5264125      501       南京路
 20012324     5264125      500       胜利路dsaf
 20015241     2323223      100       南开大学

还请大家继续想法帮帮我!

#3


自已顶一下

#4


--创建测试环境
create table #
(
  [序号] varchar(20),
  [名称] varchar(20),
  [费用] money,
  [信息] varchar(200)
)
insert #
select '20012312','4545445',10,'府前街10号' union
select '20012312','yysdf',20,'府前街10号' union
select '20012333','4525423',600,'国良路30号' union
select '20012324','5264125',501,'南京路' union
select '20012324','dd52241',500,'胜利路dsaf' union
select '20015241','2323223',100,'南开大学'
--测试
update # set [名称]=A.[名称] 
from # B
join (select [序号],[名称] from # where patindex('%[a-z]%',[名称])=0)A
on A.[序号]=B.[序号]

-- 查看
select * from #

--删除测试环境
drop table #

--结果
/*

序号                   名称                   费用                    信息   
-------------------- -------------------- --------------------- ------------
20012312             4545445              10.0000               府前街10号
20012312             4545445              20.0000               府前街10号
20012324             5264125              501.0000              南京路
20012324             5264125              500.0000              胜利路dsaf
20012333             4525423              600.0000              国良路30号
20015241             2323223              100.0000              南开大学

*/

#5


你测试一下,我没有数据测试:

select 序号,
case when t1.名称>t2.名称 then t2.名称 else  t1.名称 end as 名称,费用,信息 
from tablename t1 left join tablename t2 on t1.序号=t2.序号 and t1.名称=t2.名称
where t1.名称<>t2.名称


#6


--创建测试数据
create table bb ([id] varchar(50),[name] varchar(50),past int,info varchar(50))
insert bb select '20012312','4545445',10,'府前街10号'
union all select '20012312','yyasdf',20,'府前街10号'
union all select '20012333','4525423',600,'国良路30号'
union all select '20012324','5264125',501,'南京路'
union all select '20012324','dd52241',500,'胜利路dsaf'
union all select '20015241','2323223',100,'南开大学'
--测试
update bb set name=(select top 1 name from bb aa where aa.id=bb.id )
--删除测试数据
drop table bb

#7


拉倒抛砖引玉:
select a.序号,a.名称,b.费用,b.信息 from tablename a left join tablename b on a.序号=b.序号 where a.名称<=(select min(名称) from tablename where 序号=a.序号)
结果如下
20012312 4545445 10.0000 府前街10号
20012312 4545445 20.0000 府前街10号
20012324 5264125 501.0000 南京路
20012324 5264125 500.0000 胜利路dsaf
20012333 4525423 600.0000 国良路30号
20015241 2323223 100.0000 南开大学

#8


应该满足了cncfish (独行天下) 的要求!