【问题标题】:SQL Query - Adding total amounts from multiple tablesSQL 查询 - 从多个表中添加总金额
【发布时间】:2013-02-12 05:22:15
【问题描述】:

我正在为客户处理一个项目,需要 3 个不同表格中 3 个不同列的总和,这些表格的状态为“已清除”。

这三个表是(例如):

PAYMENT1

ID | Amount | Status  
1  | 200    | Cleared

PAYMENT2

ID | Amount | Status              
1  | 100    | Cleared

PAYMENT3

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。

谁能找出问题所在?

【问题讨论】:

  • 没有加入标准,因此您得到的是笛卡尔积。因此,结果是您预期的 3 倍。
  • 感谢您的回复 OMG 小马。需要什么来解决这个问题?

标签: mysql sql navicat


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复拉维。您能否提供一个使用 SQL 代码的示例,因为我仍然不确定。
    • 当你执行这个查询时: SELECT * FROM payment1 UNION ALL SELECT * FROM payment2 UNION ALL SELECT * FROM payment3 你会得到这样的输出: id amount status 1 200 Cleared 1 100 Cleared 1 300 Cleared现在您可以使用它作为表格来获取总和
    • @steve 这是确切的查询: select sum(p4.amount) from (SELECT p1.amount FROM payment1 as p1 UNION SELECT p2.amount FROM payment2 as p2 UNION SELECT p3.amount FROM payment3 as p3) as p4 where p4.status = 'Cleared'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多