SQL Server中CTE的另一种递归方式-从底层向上递归

2020-02-07 23:42栏目:bob体育平台
TAG:

本文实例讲述了php实现的递归提成方案。分享给大家供大家参考,具体如下:

    SQL Server中的公共表表达式(Common Table Expression,CTE)提供了一种便利的方式使得我们进行递归查询。所谓递归查询方便对某个表进行不断的递归从而更加容易的获得带有层级结构的数据。典型的例子如MSDN()中提到的获取员工关系层级的结构,如图1所示。

最近CRM项目中用到了递归提成的方案,分析如下:

图片 1

CREATE TABLE `crm_proxy_bonux_rule`  NOT NULL AUTO_INCREMENT COMMENT '超过的部份提成规则ID',`bouns_rule_name` varchar NOT NULL COMMENT '规则名称,如D套餐0-20范围',`rid` bigint DEFAULT NULL COMMENT '为0,就是默认的全局设置',`start_rang` smallint DEFAULT NULL COMMENT '开始范围', `end_rang` smallint DEFAULT NULL COMMENT '结束范围',`bonus_rate` smallint DEFAULT NULL COMMENT '提成率',`bonus_reward` decimal DEFAULT NULL COMMENT '奖励现金',`chain_pre` int DEFAULT NULL COMMENT '链表上一个值默认为0,表示根结点',`chain_next` int DEFAULT NULL COMMENT '链表下一个值',`is_standard` enum DEFAULT '0' COMMENT '是否是标准',PRIMARY KEY  ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

private function bouns_recursion($range,$standard,&$rule_list,$amount){ $price = 1000; $max = $standard['end_rang'] ;//最大值 $min = $standard['start_rang'] ;//最小值 $bonus_rate = $standard['bonus_rate'];//分红率 if{ return false; } $standard_amount = 0; $plus = 0; //是否是标准 第一个 if($standard['is_standard']==1){ $standard_amount = $price * $min * $bonus_rate / 100; //求提成 600 300 }else{ $plus = 1; //第二次要累加 } if{ $number =  + $plus;//算出差值值 5 4-3 == 1 $amount = ($price * $number * $bonus_rate / 100); //求提成 200 }else{ $number =  + $plus;//算出差值值 4 1 $amount = ($price * $number * $bonus_rate / 100); //求提成 } $amount = $amount + $standard_amount;//800 if(!empty($rule_list[$standard['chain_next']]) && $range > $max){ return $amount += $this->bouns_recursion($range, $rule_list[$standard['chain_next']], $rule_list,$amount); } return $amount;}

图1.获取员工层级结构

希望本文所述对大家PHP程序设计有所帮助。

 

    图1所示的例子是一个简单的通过递归获取员工层级的例子,主要理念是通过一个自连接的表(员工表,连接列为员工ID与其上司ID,没有上司的人为公司最大的CEO),不断递归,从而在每次递归时将员工层级+1,最终递归完成后最低级别的员工可以排出其在公司的层级,也就是如图1中所示的3。

 

    图1的例子应用场景比较广泛,网上也有很多文章提到过这种方式,但当我们需要另一种递归方式时,上面的例子就无能为力了。假设我们有这样一个需求,比如现在流程的微商传销的提成方式,假设员工分为3级,分别为一级代理、二级代理、最终销售。那么算业绩的时候可能是重复提成,比如一级代理提二级代理销售额的3%,一级代理提最终销售的1%。二级代理提最终销售的2%等等。那么我们需要从数据库中提取出所有代理的所有利润就不是一件容易的事。一个简单的示意图如图2所示:

图片 2

图2.多层提成的模型

 

    而此时每一级代理自身又可以直接进行销售,所以代理的销售额并不简单等于其下级代理销售额的和,因此我们最简单的办法就是列出每个代理所有下属的代理,并将其销售额按照业务规则相乘即可。

    因此我们需要一个查询将每个代理以及其下属层级全部列出来。由于实际需求可能都是按照省份划分代理,比如广州省是一级,广州市是二级,下属天河区是三级。下面是我们测试数据用的表:

版权声明:本文由bob体育app发布于bob体育平台,转载请注明出处:SQL Server中CTE的另一种递归方式-从底层向上递归