我正在为一个客户处理一个项目,需要3个不同表上3个不同列的总和,其中这些金额的状态表示为"已清除"。
这三个表是(例如):
付款1
ID | Amount | Status
1 | 200 | Cleared
付款2
ID | Amount | Status
1 | 100 | Cleared
付款3
ID | Amount | Status
1 | 300 | Cleared
我已经想出了以下代码,它基本上实现了我想要实现的目标,但正在处理的值将乘以三(当将多个表中的值相加时)。
SELECT SUM(CASE WHEN P1.`Status` = "Cleared" THEN P1.Amount ELSE 0 END)
+ SUM(CASE WHEN P2.`Status` = "Cleared" THEN P2.Amount ELSE 0 END)
+ SUM(CASE WHEN P3.`Status` = "Cleared" THEN P3.Amount ELSE 0 END) AS ClearedFunds
FROM PAYMENT1 As P1,
PAYMENT2 As P2,
PAYMENT3 As P3 ;
上面的查询将返回(来自给定的示例):1800,而不是预期的600。
有人能发现出了什么问题吗?
SELECT ID, SUM(Amount) totalAmount
FROM
(
SELECT ID, Amount
FROM payment1
WHERE Status = 'Cleared'
UNION ALL
SELECT ID, Amount
FROM payment2
WHERE Status = 'Cleared'
UNION ALL
SELECT ID, Amount
FROM payment3
WHERE Status = 'Cleared'
) s
GROUP BY ID
您可以将union all与三个select查询一起使用,以获得单个表的结果,然后使用sum aggregate函数来获得清除状态的金额总和。