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

luotitan 2006-12-29 09:43:31
http://community.csdn.net/Expert/topic/5260/5260107.xml?temp=.5138056
参考这个帖子,但是问题有点变化


parent_id,id,ratio
A, B, 2
A, C, 3
B, C, 4
B, D, 5


我希望得到
parent_id,id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, C, 4 , 8 (B.add_ratio*D.ratio= 1*3)
B, D, 5 , 10 C.add_ratio*E.ratio= 2*4)


关键是id=C的时候有两条记录,这时候直接用Yang_(扬帆破浪) 写的那个函数就会有点问题,大家帮忙看看如何进行修改
...全文
489 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
luotitan 2006-12-29
  • 打赏
  • 举报
回复
多谢coolingpipe(冷箫轻笛)的解决方案,但仍然寻找更好的解决方法,比如在Yang_(扬帆破浪)的基础上改造改造。
zxbyhcsdn 2006-12-29
  • 打赏
  • 举报
回复
倒!!是的规的多麻!!


写个游标算了!!
冷箫轻笛 2006-12-29
  • 打赏
  • 举报
回复
Yang_(扬帆破浪) ( ) 信誉:132 Blog 2006-12-28 8:16:18 得分: 0



不是两层的,自连接不行的




冷箫轻笛 2006-12-29
  • 打赏
  • 举报
回复
晕倒,楼上的没仔细看看另一个帖子
zxbyhcsdn 2006-12-29
  • 打赏
  • 举报
回复
如果没有重复的话,就用如下的Sql,
不明白杨帆咋写一个函数??

create table testA
(
parent_id varchar(12),
id varchar(12),
ratio int
)

insert into testA
select 'A','B',2
union all
select 'A', 'C', 3
union all
select 'B', 'C', 4
union all
select 'B', 'D', 5

--//查询
select Parent_id,
id,
ratio,
ratio * isnull((select ratio from testA where testA.id=A.Parent_id),1) as add_ratio
from
testA A

结果如下

parent_id id ratio add_ratio
---------------------------------------------
A B 2 2
A C 3 3
B C 4 8
B D 5 10

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

如果从上一个帖子来看,
parent_id,id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, C, 4 , 8
B, D, 5 , 10
C, E, 6 , --那这个数应该是18还是48呢?

如果有C,E 这样的记录,那就一定会有两条

C,E,6,18
C,E,6,48

这个说明你的表设计又问题,
stou 2006-12-29
  • 打赏
  • 举报
回复
看都看不懂,汗
冷箫轻笛 2006-12-29
  • 打赏
  • 举报
回复
--环境
create table tt
(
parent_id varchar(2),
id varchar(2),
ratio int
)

insert into tt select 'A', 'B', 1
insert into tt select 'A', 'C', 2
insert into tt select 'B', 'C', 7
insert into tt select 'B', 'D', 3
insert into tt select 'C', 'E', 4
insert into tt select 'D', 'F', 5
insert into tt select 'E', 'G', 6

--建立存储过程
create proc p_add_ratio
as
begin
declare @row int
declare @i int
set @i = 0

select guid = identity(int,1,1),* into #t from tt
select parent_id,id,ratio,0 as add_ratio into #list from tt where 1 < 1

select @row = count(1) from #t
while (@i <= @row)
begin
insert into #list
select a.parent_id,a.id,a.ratio,a.ratio * isnull(b.add_ratio,1)
from #t a left join #list b on a.parent_id = b.id
where a.guid = @i

set @i = @i + 1

end
select * from #list
drop table #list
drop table #t
end
go

--执行
exec p_add_ratio

--结果
A B 1 1
A C 2 2
B C 7 7
B D 3 3
C E 4 8
C E 4 28
D F 5 15
E G 6 48
E G 6 168
zxbyhcsdn 2006-12-29
  • 打赏
  • 举报
回复
晕哟!两条就麻烦了!!
luotitan 2006-12-29
  • 打赏
  • 举报
回复
UP
luotitan 2006-12-29
  • 打赏
  • 举报
回复
UP
luotitan 2006-12-29
  • 打赏
  • 举报
回复
从上面的数据看不出问题来啊?


如果从上一个帖子来看,
parent_id,id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, C, 4 , 8
B, D, 5 , 10
C, E, 6 , --那这个数应该是18还是48呢?

如果有C,E 这样的记录,那就一定会有两条

C,E,6,18
C,E,6,48
冷箫轻笛 2006-12-29
  • 打赏
  • 举报
回复
从上面的数据看不出问题来啊?


如果从上一个帖子来看,
parent_id,id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, C, 4 , 8 (B.add_ratio*D.ratio= 1*3)
B, D, 5 , 10 C.add_ratio*E.ratio= 2*4)
C, E, 6 , --那这个数应该是18还是48呢?
rookie_one 2006-12-29
  • 打赏
  • 举报
回复
mark,学习
luotitan 2006-12-29
  • 打赏
  • 举报
回复
up
luotitan 2006-12-29
  • 打赏
  • 举报
回复
我希望得到
parent_id,id,ratio,add_ratio
A, B, 2 , 2
A, C, 3 , 3
B, C, 4 , 8 (B.add_ratio*C.ratio= 2*4)
B, D, 5 , 10 (B.add_ratio*E.ratio= 2*5)
shuy2006 2006-12-29
  • 打赏
  • 举报
回复
不是好明白
chai21cn 2006-12-29
  • 打赏
  • 举报
回复
只用了select语句,需要考虑速度
就建个临时表 把
select a.*,a.ratio*isnull(b.ratio,1) as add_ratio from tt a left join tt b on a.parent_id = b.id
数据整进去,自己再改改SQL

chai21cn 2006-12-29
  • 打赏
  • 举报
回复
create table tt
(
parent_id varchar(2),
id varchar(2),
ratio int
)

insert into tt select 'A', 'B', 2
insert into tt select 'A', 'C', 3
insert into tt select 'B', 'C', 4
insert into tt select 'B', 'D', 5
insert into tt select 'C', 'E', 6

select distinct a.parent_id,a.id,a.ratio,a.ratio*isnull(b.add_ratio,1) as add_ratio from
(select a.*,a.ratio*isnull(b.ratio,1) as add_ratio from tt a left join tt b on a.parent_id = b.id) a
left join
(select a.*,a.ratio*isnull(b.ratio,1) as add_ratio from tt a left join tt b on a.parent_id = b.id) b
on a.parent_id = b.id

drop table tt
冷箫轻笛 2006-12-29
  • 打赏
  • 举报
回复
函数估计有问题

因为函数应该不能把一条纪录变成两条

34,837

社区成员

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

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