Модифицированный предзаказ дерева обхода ребенка Roll Up - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь свернуть расходы дочерней компании, включая все компании внуков, без каких-либо рекурсивных функций.

Мой набор данных выглядит примерно так:

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

И я знаю, как сложить для каждого ребенка (исключая внуков) для родителя А:

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

Может ли кто-нибудь мне помочь?Я полагаю, что мне нужен отбор, но мне трудно его понять.

1 Ответ

0 голосов
/ 02 августа 2011

Сначала выберите дочерние компании, которые вас интересуют (таблица c). Я использовал подзапрос, чтобы легко выбрать прямых потомков в «Parent A». Затем снова присоединитесь к companies_table, чтобы получить всех потомков (псевдоним таблицы c2). И, наконец, присоединитесь к вашей расходной таблице, чтобы получить суммы, которые вы можете агрегировать с помощью группировки.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...