2

我正在为客户开发一个项目,需要 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。

谁能找出问题所在?

4

2 回答 2

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
于 2013-02-12T07:58:00.040 回答
0

您可以将 union all 与三个选择查询一起使用以将结果作为单个表获取,然后使用 sum 聚合函数获取清除状态的金额的总和。

于 2013-02-12T05:25:38.040 回答