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だけの各子供とその金額をリストする方法を知っています。

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`

どちらが出力されますか:

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

そして、親 A の各子 (孫を除く) を合計する方法を知っています。

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

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

4

1 に答える 1

0

まず、関心のある子会社を選択します(表 c)。サブクエリを使用して、「親 A」の直接の子を簡単に選択しました。次に、companys_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
于 2011-08-01T21:19:39.837 に答える