この質問は階層データに多少関連していますが、データベースからストアドプロシージャが既にあり、以下のデータを返しています。私は階層を構築する方法を見つけようとしているのではなく (完了)、PHP でその階層に基づいて数値を計算する最良の方法を見つけようとしています (おそらく再帰配列ですか?)。
カスタム ストアド プロシージャを使用して、当社の営業担当者、販売した製品、および新しい行の各製品の「収益」パーセンテージと、その後の営業担当者 (ツリー内の場合) のリストを取得できます。 .
返されるデータの例は次のとおりです。
Repnum | Name | productID | sales | earn | depth | parentRep
------------------------------------------------------------
1 | A | 1 | 5000 | 0.50 | 1 | 0
1 | A | 2 | 10000 | 0.35 | 1 | 0
2 | B | 1 | 400 | 0.40 | 2 | 1
2 | B | 2 | 1000 | 0.30 | 2 | 1
7 | E | 1 | 30000 | 0.35 | 3 | 2
3 | C | 1 | 5000 | 0.33 | 2 | 1
返されるデータの順序は、ここに示されていない深さと情報に基づいて、適切にフォーマットおよびソートされていると想定しても問題ありません。ツリー ビューでは、上記のデータは次のようになります。
1-A-1-5000-0.50-1-0
1-A-2-10000-0.35-1-0
2-B-1-400-0.40-2-1
2-B-2-1000-0.30-2-1
7-E-1-30000-0.35-3-2
3-C-1-5000-0.33-2-1
while(results) ループでは、返された各 repnum に対して次の計算を試みています。
- その担当者の売上の合計に、各製品の獲得 % を掛けたもの (それらの合計売上と獲得金額)
- 各ダウンライン ツリーの合計売上高に、現在の担当者とその下のレベルの差を掛けたもの
これがどのように機能するかを計算するには、次のようにします。
担当者 1 の収益:
Rep 1 total sales = 5000 + 10000 = 15,000
Rep 1 earn on self = (5000 * 0.50) + (10000 * 0.35) = 6,000 hello!
Rep 2 total sales = 400 + 1000 = 1400
Rep 1 earn on rep 2 sales = (400 * (0.50-0.40) + (1000 * (.35-0.30)) = 90
Rep 7 total sales = 30000
Rep 1 earn on rep 7 sales = (30000 * (0.50-0.40)) = 3000*
(* the reason the earn is calculated at rep 1 earn - rep 2 earn is because in any tree, the "parent" can only ever earn the difference of his/her earn and the direct depth below him/her)
Rep 3 total sales = 5000
Rep 1 earn on rep 3 sales = (5000 * (0.50-0.33)) = 850
**Rep 1 TOTAL earn = 6,000 + 90 + 3000 + 850 = 9,940**
担当者 2 の収益:
Rep 2 total sales = 400 + 1000 = 1400
Rep 2 total earn on self = (400 * 0.40) + (1000 * 0.30) = 460
Rep 7 total sales = 30000
Rep 2 total earn on rep 7 sales = (30000 * (0.40-0.35)) = 1500*
(* here, rep 2 earns the difference between him/her and rep 7 because he is in the depth right above it / his/her parent)
**Rep 2 TOTAL earn = 460 + 1500 = 1,960**
... 等々
HEAVY mysql 再帰を使用するスクリプトを作成し、深さごとに多数の while() ループを単純に実行することもできましたが、先に進んで階層を事前計算するために使用するストアド プロシージャを考えると、それは不要であり、システムに負担がかかることがわかりました。深さを調整し、データを適切に並べ替えます。トップレベルの担当者を計算するのは簡単ですが、リストの2番目の人から戻って(など)、最初からやり直すのは私が苦労しているところです.
上記のサンプル データに基づいて、次のような出力を返すことができるようにしたいと考えています。
num | Name | earnAmount
------------------------
1 | A | 9940
2 | B | 1960
7 | E | 10500
3 | C | 1650
事前に助けてくれてありがとう!
尋ねられた質問に関するメモ:
Q: 獲得率はどのように計算されますか?
A: それらは計算されません。担当者が販売している特定の productID によって決定されます。
Q: 「レベル」や親子関係はどのように決めているのですか?
A: 私はこの例ではありません。方程式のこの部分は、MySQL ストアド プロシージャによって処理され、多くの点で関連性がありません (各担当者の親 repnum を表示することもできますが、配列は上から下に構築されるため、あまり役に立たない可能性があります)。 )。最初のテーブルのサンプル データの深度と並べ替え順序は、PHP の簡単な print(results_array) ステートメントで各ツリーを出力できるように、既にフォーマットされ、レイアウトされています。
Q: 最初のテーブルの productID の関連性は何ですか?
A: 各担当者は、productID で分類されたシステム (数百) で利用可能なすべての製品を販売できます。各担当者は、その特定の製品の各販売のパーセンテージも獲得します。獲得率は、特定の製品タイプ (製品ごとに最大と最小の獲得値があります) や特定の深さとはまったく関係ありません (ただし、より深い深さの担当者は、ダウンライン ツリーよりも特定の productID の獲得率が低くなることはありません)。 .
Q: データは最初のテーブルでどのように並べ替えられていますか?
A: あまり関係ありません (信じてください) が、舞台裏でパンくず列を作成します。これは現在の repnum を取得し、子を追加し、その時点でのツリーの深さに基づいて並べ替えます。与えられた例:
0 (invisible parent which selects ALL sales reps)
0-1
0-1-2
0-1-2-7
0-1-3
...