从两个联接的聚合查询中计算

时间:2019-12-06 15:38:03

标签: mysql

我有两个要计算的汇总子查询。该查询在不进行最终计算的情况下仍能正常工作,但是当我从两个子查询中添加总和计算时,会将其全部归为一个总和。

设置为两个表,其中一个表(父母付款)具有我要分组以获取总付款的付款。另一个(服务日志)已发送时间和该时间的费率。该服务已发布给孩子,因此我需要从孩子那里查找父母ID。我需要总余额,所以我要找到“已计算的到期”和“已付款”之间的差异。

我正在使用的查询是:

SELECT PID, b.Due, a.Paid, SUM(b.Due - a.Paid) FROM 
(SELECT Person AS par, SUM(Amount) AS Paid FROM parentpayments GROUP BY pp.Person) AS a 
JOIN 
(SELECT p.ID AS PID, SUM(l.Time * l.Rate) AS Due FROM servicelog AS l INNER JOIN children AS c ON c.ID = l.Child INNER JOIN people AS p ON p.ID = c.Parent GROUP BY p.ID) AS b 
ON PID = Par

这可能吗?

1 个答案:

答案 0 :(得分:2)

外部查询中不需要SUM()PIDPar在子查询中已经是唯一的。因此,将其中之一分组是没有意义的。但是,如果在不使用GROUP BY的情况下使用SUM(),则只会得到一行,并且选择PIDDuePaid毫无意义。因此,您只需要删除SUM()

SELECT PID, b.Due, a.Paid, b.Due - a.Paid FROM 
(SELECT Person AS par, SUM(Amount) AS Paid FROM parentpayments GROUP BY pp.Person) AS a 
JOIN 
(SELECT p.ID AS PID, SUM(l.Time * l.Rate) AS Due FROM servicelog AS l INNER JOIN children AS c ON c.ID = l.Child INNER JOIN people AS p ON p.ID = c.Parent GROUP BY p.ID) AS b 
ON PID = Par

尽管可以使用查询并附加GROUP BY PID。但这与按主键分组一样。每个组仅包含一行。 SUM()等于其参数。

还有另一种方法可以达到相同的结果。您可以使用UNION代替JOIN-并且您将需要SUM()。请注意,在这种情况下,您无法分别选择DuePaid-仅选择余额:

SELECT PID, SUM(amount) as balance
FROM (
    SELECT Person AS PID, SUM(Amount) AS amount
    FROM parentpayments
    GROUP BY pp.Person
    UNION ALL
    SELECT p.ID AS PID, -SUM(l.Time * l.Rate) AS amount
    FROM servicelog AS l
    INNER JOIN children AS c ON c.ID = l.Child
    INNER JOIN people AS p ON p.ID = c.Parent
    GROUP BY p.ID
) AS x
GROUP BY PID
相关问题