2011-08-01 13 views
2

私は、再帰的な機能を持たないすべての孫会社を含む子会社からの経費をロールアップしようとしています。変更されたプレオーダーツリートランスバーサルチャイルドロールアップ

私のデータセットは、この形式のようになります。私がやりたいのは何

Parent A 
- Child A.1 - $1,000 
- Child A.2 - $2,000 
- - Grandchild A.2.1 - $500 
- - Grandchild A.2.2 - $750 
- Child A.3 - $3,000 
- Child A.4 - $4,000 
Parent B 
- Child B.1 - $11,000 
- Child B.2 - $12,000 
- - Grandchild B.2.1 - $1,500 
- - Grandchild B.2.2 - $1,750 
- Child B.3 - $13,000 
- Child B.4 - $14,000 

は、親Aの子で和であり、その結果は以下のような出力になります。

Child A.1 - $1,000 
Child A.2 - $3,250 
Child A.3 - $3,000 
Child A.4 - $4,000 

この私の会社テーブルの簡略化された構造です:

id 
name 
parent_id 
lft 
rght 

これは私の支出テーブルの簡略化された構造です:

id 
company_id 
amount 
date 

私はそれぞれの子を一覧表示する方法を知っているとちょうど親Aのためのそれらの量:

Child A.1 - $1,000 
Child A.2 - $2,000 
Grandchild A.2.1 - $500 
Grandchild A.2.2 - $750 
Child A.3 - $3,000 
Child A.4 - $4,000 

そして、私はそれぞれの子のために合計する方法を知っている:出力だろう

SELECT 
`Company`.`name` AS `name`, 
SUM(`Spend`.`amount`) AS `amount` 
FROM 
`spend_table` AS `Spend` 
INNER JOIN companies_table AS `Company` ON `Spend`.`company_id` = `Company`.`id` 
INNER JOIN companies_table AS `thisCompany` ON `Company`.`lft` BETWEEN `thisCompany`.`lft` AND `thisCompany`.`rght` 
WHERE 
`thisCompany`.`name` = 'Parent A' 
GROUP BY 
`Company`.`name` 

(親を除く):

SELECT 
`Company`.`name` AS `name`, 
SUM(`Spend`.`amount`) AS `amount` 
FROM 
`spend_visibility2` AS `SpendVisibility` 
`spend_table` AS `Spend` 
INNER JOIN companies_table AS `Company` ON `Spend`.`company_id` = `Company`.`id` 
INNER JOIN companies_table AS `thisCompany` ON `Company`.`lft` BETWEEN `thisCompany`.`lft` AND `thisCompany`.`rght` 
WHERE 
`thisCompany`.`name` = 'Parent A' 
`Company`.`parent_id` = `thisCompany`.`id` 
GROUP BY 
`Company`.`name` 

出力する:

Child A.1 - $1,000 
Child A.2 - $2,000 
Child A.3 - $3,000 
Child A.4 - $4,000 

誰かが私を助けることができますか?私はサブセレクトが必要だと思っていますが、それを理解するのが難しいです。

答えて

0

まず、興味のある子会社を選択します(表c)。サブクエリを使用して、「親A」の直系子を簡単に選択しました。次に、companies_tableに再度参加して、すべての子孫(テーブルエイリアスc2)を取得します。そして最後にあなたのspend_tableに参加し、あなたが集めることができる金額をgroup byで取得します。

select c.name, sum(s.amount) 
from companies_table c 
    join companies_table c2 ON c2.lft between c.lft and c.rght 
    join spend_table s ON c2.id = s.company_id 
where parent_id = (select id from companies_table where name = 'Parent A') 
group by c.name 
+0

完璧!ご協力いただきありがとうございます! – Andrew

関連する問題