大家帮忙看看这个SQL怎么写

luotitan 2006-12-27 05:07:55

parent_id,id,ratio
A, B, 1
A, C, 2
B, D, 3
C, E, 4
D, F, 5
E, G, 6

我希望得到
parent_id,id,ratio,add_ratio
A, B, 1 , 1
A, C, 2 , 2
B, D, 3 , 3 (B.add_ratio*D.ratio= 1*3)
C, E, 4 , 8 (C.add_ratio*E.ratio= 2*4)
D, F, 5 , 15 (D.add_ratio*E.ratio= 3*5)
E, G, 6 , 48 (E.add_ratio*G.ratio= 8*6)
...全文
580 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
luotitan 2006-12-28
  • 打赏
  • 举报
回复

parent_id,id,ratio
A, B, 1
A, C, 2
B, D, 3
C, E, 4
D, F, 5
E, G, 6


我希望得到
parent_id,id,ratio,add_ratio
A, B, 1 , 1
A, C, 2 , 2
B, D, 3 , 3
C, E, 4 , 8
D, F, 5 , 15
E, G, 6 , 48

()里面的是说明add_ratio如何计算得到的,而不是查询结果

函数递归的方法已经实现了,等待 WNASP(好好学习,天天向上) 给出两个表自连接的解决方案,最好能详细一些,下午下班的时候结帖
中国风 2006-12-28
  • 打赏
  • 举报
回复
楼主要这样的效果,光用查询是实现不了的,所以只有用函数
marco08 2006-12-28
  • 打赏
  • 举报
回复
用楊兄的函數可以實現
中国风 2006-12-28
  • 打赏
  • 举报
回复
E, G, 6 , 48 (E.add_ratio*G.ratio= 8*6)--楼主的这一段为2*4*6(是一个递规,看查询是实现不了的。
中国风 2006-12-28
  • 打赏
  • 举报
回复
create table ta(parent_id varchar(10),id varchar(10),ratio int)
insert into ta(parent_id,id,ratio) select 'A','B',1
union all select 'A','C',2
union all select 'B','D',3
union all select 'C','E',4
union all select 'D','F',5
union all select 'E','G',6

--select t.parent_id,t.id,t.ratio,add_ratio=t.ratio*isnull(t1.ratio,1) from ta t left join ta t1 on t.parent_id=t1.id

create function test_f (@parent_id varchar(10),@id varchar(10))
returns int
as
begin
declare @i int
select @i=ratio from ta where parent_id=@parent_id and id=@id
while exists(select 1 from ta where id=@parent_id)
begin
select @i=@i*ratio from ta where id=@parent_id
select @parent_id=parent_id from ta where id=@parent_id
end
return @i
end

select *,add_ratio=dbo.test_f(parent_id,id) from ta

parent_id id ratio add_ratio
---------- ---------- ----------- -----------
A B 1 1
A C 2 2
B D 3 3
C E 4 8
D F 5 15
E G 6 48

(所影响的行数为 6 行)
hunhun02 2006-12-28
  • 打赏
  • 举报
回复
楼主能不能把你要做什么说清楚啊?
WNASP 2006-12-28
  • 打赏
  • 举报
回复
TO Yang_(扬帆破浪)
我使用的是cast(t2.ratio as varchar(10))+'*'+cast(t1.ratio/t2.ratio as varchar(10))
随便找了个规律t1.ratio/t2.ratio
但就楼主给的例子来说是完全符合的,我也看过你的函数,使用的是递归,这样性能非常非常难以保证,当select的时候,扫描表的每一行的时候,都要去递归,数据量稍微大一点,速度马上就下来
如果要按你的做法,最好再加一个冗余字段,记录它的路径
Yang_ 2006-12-28
  • 打赏
  • 举报
回复
不是两层的,自连接不行的
mengmou 2006-12-27
  • 打赏
  • 举报
回复
楼上的……
WNASP 2006-12-27
  • 打赏
  • 举报
回复
declare @t table (parent_id varchar(10),id varchar(10),ratio int)
insert into @t(parent_id,id,ratio) select 'A','B',1
union all select 'A','C',2
union all select 'B','D',3
union all select 'C','E',8
union all select 'D','F',15
union all select 'E','G',48

--select * from @t

select t1.*,t2.id+'.add_ratio*'+t1.id+'.tatio='+cast(t2.ratio as varchar(10))+'*'+cast(t1.ratio/t2.ratio as varchar(10)) from @t t1
left join @t t2 on t1.parent_id=t2.id
WNASP 2006-12-27
  • 打赏
  • 举报
回复
declare @t table (parent_id varchar(10),id varchar(10),ratio int)
insert into @t(parent_id,id,ratio) select 'A','B',1
union all select 'A','C',2
union all select 'B','D',3
union all select 'C','E',8
union all select 'D','F',15
union all select 'E','G',48

--select * from @t

select t1.*,t2.*,t2.id+'.add_ratio*'+t1.id+'.tatio='+cast(t2.ratio as varchar(10))+'*'+cast(t1.ratio/t2.ratio as varchar(10)) from @t t1
left join @t t2 on t1.parent_id=t2.id

这条语句完全在查询分析其上执行过,试试看吧
luotitan 2006-12-27
  • 打赏
  • 举报
回复
太简单了,两个表自连接就可以了啊

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

能否写给我看看,能不用函数最好。
mengmou 2006-12-27
  • 打赏
  • 举报
回复
学习
WNASP 2006-12-27
  • 打赏
  • 举报
回复
太简单了,两个表自连接就可以了啊
tianbaobao 2006-12-27
  • 打赏
  • 举报
回复
学习一下
Yang_ 2006-12-27
  • 打赏
  • 举报
回复
没测试
Yang_ 2006-12-27
  • 打赏
  • 举报
回复
写个函数
create function fn_add_ratio(
@id varchar(20)
)
returns numeric(18,2)
as
begin
declare @ratio numeric(18,2)
declare @Parent_id varchar(20)
select @ratio=ratio,@Parent_id=Parent_id from tablename where id=@id
if @ratio is null
return 1
return @ratio*dbo.fn_add_ratio(@Parent_id)
end
go

--查询
select *,
dbo.fn_add_ratio(id) as add_ratio
from tablename


34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧