-1

У меня есть две таблицы MySQL

+--------+-------+
| parent | child |
+--------+-------+
| A      | B     |
| B      | C     |
| C      | D     |
| D      | E     |
| F      | F     |
+--------+-------+

Здесь Ребенок является дочерней компанией Материнской компании. а также

+---------+----------+
| account | bookings |
+---------+----------+
| A       |      100 |
| B       |       20 |
| C       |       40 |
| D       |       60 |
| E       |       10 |
| F       |        5 |
+---------+----------+

Мне нужно написать SQL-запрос, чтобы получить следующий вывод

+---------+----------+
| A       |      230 |
| F       |        5 |
+---------+----------+ 

Выходными данными является сумма всех столбцов во второй таблице, которые имеют дочерние компании, сгруппированные по материнской компании. В этом случае A имеет дочернюю компанию B, а дочернюю - C и так далее.

1 ответ1

1

Я настроил несколько тестовых таблиц для репликации схемы и данных, которые вы описали:

CREATE TABLE Accounts(
    Parent VARCHAR(1),
    Child VARCHAR(1)
)

CREATE TABLE Bookings (
    Account VARCHAR(1),
    Bookings INT
)

INSERT INTO Accounts
SELECT 'A','B'
UNION
SELECT 'B','C'
UNION
SELECT 'C','D'
UNION
SELECT 'D','E'
UNION
SELECT 'F','F'

INSERT INTO Bookings
SELECT 'A', 100
UNION
SELECT 'B', 20
UNION
SELECT 'C', 40
UNION
SELECT 'D', 60
UNION
SELECT 'E', 10
UNION
SELECT 'F', 5
GO

Я бы создал скалярную функцию для возврата родителя "верхнего уровня" любой данной учетной записи:

CREATE FUNCTION fnAccountTopParent (@Account VARCHAR(1))
RETURNS VARCHAR(1)
AS
BEGIN
    DECLARE @Parent VARCHAR(1)
    DECLARE @Child VARCHAR(1)

    SET @Child = @Account
    SELECT @Parent = Parent FROM Accounts WHERE Child = @Child

    WHILE (@Parent IS NOT NULL AND @Parent <> @Child)
    BEGIN
        SET @Child = @Parent
        SELECT @Parent = Parent FROM Accounts WHERE Child = @Child
    END

    RETURN @Child

END
GO

Затем эту функцию можно использовать в запросе, чтобы получить желаемый результат:

SELECT  dbo.fnAccountTopParent(Account) AS Account,
        SUM(Bookings) AS Bookings
FROM Bookings
GROUP BY dbo.fnAccountTopParent(Account)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .