邹哥,求一条sql语句。。急。。。。一百分不够,再加

时间:2021-03-05 14:36:27
有一张表:如下
shop_id    num   layer  layer_no
001         12    0        0
002         13    00       1
003         14    10       1
004         15    000      2
005         16    100      2
006         17    010      2
007         18    110      2
......
我想得到另一张表:如下
shop_id    left_num    right_num
001        13+15+16    14+17+18
002        15           16
003        17           18
004        0            0
005        0            0
006        0            0
007        0            0

我解释一下:
比如shop_id=001,001本身的layer=0,求001的left_num,即求layer最后两位为"00"的num,
求001的right_num,即求layer最后两位为"10"的num.而求shop_id=002的left_num时,即求
layer最后三们为"000"的num,求shop_id=002的right_num时,即求layer最后三们为"100"的num.
以此类推到最后一个id..

急求这条语句。。。一百分不够再加分。。
先谢谢了。。。。。

13 个解决方案

#1


我自己顶一下,,帮忙呀。

#2


自己再顶。。。急呀。。

#3


好像写一个函数就行

#4


能帮我吗。。

#5


UP

#6


又看到小李铅笔刀

我想到一个方法就是用游标

#7


有谁能帮我吗。。?我做了半天没有出来。。。

#8


楼主你试一下,看行不
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varcahr(8000)
   set @s=''
   select @s=@s+','+shop_id from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#9


先谢谢了。。我去试试。。

#10


--建立一个测试环境
create  table tablename (shop_id varchar(3),   num int,layer varchar(100), layer_no int)
insert into tablename values ('001',12,'0',0)
insert into tablename values('002',13,'00',0)
insert into tablename values('003',14,'10',0)
insert into tablename values('004',15,'000',0)
insert into tablename values('005',16,'100',0)
insert into tablename values('006',17,'010',0)
insert into tablename values('007',18,'110',0)
 go
--建立一个函数
create function dbo.getvalue(@layer varchar(100),@num varchar(10),@type varchar(10))
returns varchar(1000)
as
begin
declare @hhh varchar(1000)
set @hhh=''
select  @hhh=@hhh+convert(varchar(10),num)+',' from tablename 
where  right(layer,len(@layer)+1)  =@type+@layer 
set @hhh = case @hhh when '' then '00' else @hhh end 
return left(@hhh,case len(@hhh) when 0 then 1 else len(@hhh) end -1)
end
go
--测试
 select shop_id,dbo.getvalue(convert(varchar(100),layer),convert(varchar(100),num),'0'),
dbo.getvalue(convert(varchar(100),layer),convert(varchar(100),num),'1') from tablename
--删除测试环境
drop table tablename
drop function dbo.getvalue

#11


有点错误,我改一下  楼主,你我下面写的这个
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varchar(8000)
   set @s=''
   select @s=@s+','+num from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#12


还是有错误   这回可以了
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varchar(8000)
   set @s=''
   select @s=@s+','+cast(num as varchar(100)) from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#13


谢谢,,搞定了。。。马上给分。。。

#1


我自己顶一下,,帮忙呀。

#2


自己再顶。。。急呀。。

#3


好像写一个函数就行

#4


能帮我吗。。

#5


UP

#6


又看到小李铅笔刀

我想到一个方法就是用游标

#7


有谁能帮我吗。。?我做了半天没有出来。。。

#8


楼主你试一下,看行不
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varcahr(8000)
   set @s=''
   select @s=@s+','+shop_id from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#9


先谢谢了。。我去试试。。

#10


--建立一个测试环境
create  table tablename (shop_id varchar(3),   num int,layer varchar(100), layer_no int)
insert into tablename values ('001',12,'0',0)
insert into tablename values('002',13,'00',0)
insert into tablename values('003',14,'10',0)
insert into tablename values('004',15,'000',0)
insert into tablename values('005',16,'100',0)
insert into tablename values('006',17,'010',0)
insert into tablename values('007',18,'110',0)
 go
--建立一个函数
create function dbo.getvalue(@layer varchar(100),@num varchar(10),@type varchar(10))
returns varchar(1000)
as
begin
declare @hhh varchar(1000)
set @hhh=''
select  @hhh=@hhh+convert(varchar(10),num)+',' from tablename 
where  right(layer,len(@layer)+1)  =@type+@layer 
set @hhh = case @hhh when '' then '00' else @hhh end 
return left(@hhh,case len(@hhh) when 0 then 1 else len(@hhh) end -1)
end
go
--测试
 select shop_id,dbo.getvalue(convert(varchar(100),layer),convert(varchar(100),num),'0'),
dbo.getvalue(convert(varchar(100),layer),convert(varchar(100),num),'1') from tablename
--删除测试环境
drop table tablename
drop function dbo.getvalue

#11


有点错误,我改一下  楼主,你我下面写的这个
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varchar(8000)
   set @s=''
   select @s=@s+','+num from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#12


还是有错误   这回可以了
create function c_str(@layer varchar(100))
returns varchar(8000)
as
begin
   declare @s varchar(8000)
   set @s=''
   select @s=@s+','+cast(num as varchar(100)) from t where right(layer,len(@layer))=@layer
   return stuff(@s,1,1,'')
end
select shop_id
       ,left_num=dbo.c_str('0'+layer)
       ,right_num=dbo.c_str('1'+layer)
from t

#13


谢谢,,搞定了。。。马上给分。。。