我有两个要计算的汇总子查询。该查询在不进行最终计算的情况下仍能正常工作,但是当我从两个子查询中添加总和计算时,会将其全部归为一个总和。
设置为两个表,其中一个表(父母付款)具有我要分组以获取总付款的付款。另一个(服务日志)已发送时间和该时间的费率。该服务已发布给孩子,因此我需要从孩子那里查找父母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
这可能吗?
答案 0 :(得分:2)
外部查询中不需要SUM()
。 PID
和Par
在子查询中已经是唯一的。因此,将其中之一分组是没有意义的。但是,如果在不使用GROUP BY的情况下使用SUM(),则只会得到一行,并且选择PID
,Due
和Paid
毫无意义。因此,您只需要删除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()
。请注意,在这种情况下,您无法分别选择Due
和Paid
-仅选择余额:
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