【问题标题】:MySQL - Complicated SUMs inside QueryMySQL - 查询中的复杂 SUM
【发布时间】:2013-01-09 23:28:40
【问题描述】:

这很难解释。

我每天从tbl_customers 循环浏览我的客户记录数次。

SELECT c.* FROM tbl_customers c

我只返回客户的:customeridnamephoneemail

现在是奇怪的部分。 我想在电子邮件之后再添加 3 列:totalpaid、totalowed、totalbalance 但是,这些列名在任何地方都不存在。

这是我如何查询每个:(作为单个查询)

SELECT SUM(total) AS totalpaid 
FROM tbl_customers_bills 
WHERE customerid = X
AND billtype = 1

SELECT SUM(total) AS totalowed 
FROM tbl_customers_bills 
WHERE customerid = X
AND billtype = 2

SELECT SUM(total) AS totalbalance 
FROM tbl_customers_bills 
WHERE customerid = X
AND billtype IN(1,2)

所以,billtype 是告诉我记录是否已支付的列。

我在这里不知所措。 如何将 3 个单独的查询相加到第一个查询的循环中?

【问题讨论】:

    标签: mysql sum subquery


    【解决方案1】:

    只需将客户加入账单并计算总和即可。要分离出totalpaid 和totalowed,您可以使用SUM(CASESUM(IF 作为wless1's answer demonstrates

    SELECT c.*,
            SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END) totalpaid ,
            SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END) totalowed ,
            SUM(total) AS totalbalance
    FROM 
        tbl_customers c
        LEFT JOIN tbl_customers_bills  b
        ON c.customerid = b.customerid
         and billtype in (1,2)
    GROUP BY 
         c.customerid
    

    因为这是MySQL,所以只需要对客户的PK进行分组。

    【讨论】:

      【解决方案2】:

      您可以使用GROUPSUMIF 的组合来完成此操作

      SELECT c.id, c.name, c.phone, c.email, 
      SUM(IF(b.billtype = 1, b.total, 0)) AS totalpaid,
      SUM(IF(b.billtype = 2, b.total, 0)) AS totalowed,
      SUM(IF(b.billtype = 1 OR b.billtype = 2, b.total, 0)) AS totalbalance,
      FROM tbl_customers c LEFT JOIN tbl_customers_bills b ON b.customerid = c.id
      GROUP BY c.id
      

      见: http://dev.mysql.com/doc/refman/5.0/en//group-by-functions.html http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多