找到 SQL 表中与第二个表相关的所有行的总和

找到 SQL 表中与第二个表相关的所有行的总和

我有两个 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,而 B 又拥有子公司 C,依此类推。

答案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)

相关内容