提成计算!求助!给个思路也好!
目前我能查出以下结构
id为当前用户的编号,pid为当前用户的上级用户id,lv为当前用户的等级,iden是我自定义标识列。
需求是要计算所有人提成分红,假设第一个人的收入是1000,那么他的上级根据lv可以提成6%,3%,1%不同的提成,这个上下级关系有可能无限极,并且6%提成职位的人只能提取自己子代6代内子代的收入提成,3%提成职位的人能够提成自己子代9代内的所有人收入的3%,1%的职位人员可以取自己下面无限代的提成1%.
所以每个人的收入分成两部份,一个是从下面子代中提到多少,二是被上面的人提走多少。
怎么去存储那么多的数据上查又下查?
拜求大神指点!!谢谢!!!!! 无限级提成计算
[解决办法]
--测试数据
CREATE TABLE t_A
(ID int,name VARCHAR(6),ParentID int)
INSERT INTO t_A
SELECT 1,'aa',0
UNION ALL
SELECT 2,'bb',0
UNION ALL
SELECT 3,'cc',1
UNION ALL
SELECT 4,'dd',3
go
--求个节点下所有子节点:
create function f_cid(@id int)
returns varchar(500)
as
begin
declare @t table(id int,desn varchar(10),parentid int ,lev int)
declare @lev int
set @lev=1
insert into @t select *,@lev from t_A where id=@id
while(@@rowcount>0)
begin
set @lev=@lev+1
insert into @t select a.*,@lev from t_A a,@t b
where a.parentid=b.id and b.lev=@lev-1
end
declare @cids varchar(500)
select @cids=isnull(@cids+'-','')+ltrim(id) from @t order by lev
return @cids
end
go
--自定义函数方式实现子节点查询父节点
if OBJECT_ID('GetParentID') is not null drop function GetParentID
go
create function GetParentID(@ChildID int)
returns varchar(500)
as
begin
declare @t table(ParentID int)
insert into @t select ParentID from t_A where ID=@ChildID
while @@rowcount<>0
begin
insert into @t select a.ParentID from t_A as a
inner join @t as b
on a.ID=b.ParentID
and not exists(select 1 from @t where ParentID=a.ParentID)
end
declare @pids varchar(500)
select @pids=isnull(@pids+'-','')+ltrim(ParentID) from @t
return @pids
end
go
select *,dbo.f_cid(id) as zjd ,dbo.GetParentID(id) as fjd from t_A
drop table t_A
(4 行受影响)
给你个列子查出父节点(fjd)和其子节点(zjd )
然后分别算出父节点个数*提成%*1000,和子节点个数*提成%*1000
然后用1000 +(子节点个数*提成%*1000)-(父节点个数*提成%*1000)
这样就能算出每个人的奖金了!
[解决办法]
思路:
为每个用户生成追溯9代上级的记录。。。
另外,如果级数超过100,那最低级的用户岂不是所有收入都被提光了?!
[解决办法]
如果是2005以上的版本,考虑用递归来实现把
[解决办法]
就是个典型的递归,只是判断一下提成级数即可
理论是级数是无限的,但实际中估计最多也就十来级而已