我正在为一个客户开展一个项目,并要求在3个不同的表上总共有3个不同的列,其中这些数量的状态表示为“已清除”。
这三个表(作为例子):
PAYMENT1
ID | Amount | Status
1 | 200 | Cleared
PAYMENT2
ID | Amount | Status
1 | 100 | Cleared
PAYMENT3
ID | Amount | Status
1 | 300 | Cleared
我已经提出了以下代码,它基本上实现了我想要实现的功能,但是正在处理的值将被乘以3(当从多个表中添加值时)。
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的预期结果。
任何人都可以找出出错的地方吗?
答案 0 :(得分:1)
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
答案 1 :(得分:0)
您可以使用union all和三个选择查询将结果作为单个表格获得,然后使用sum aggregate函数获取状态被清除的金额总和。