1

これを説明するのは難しいでしょう。

tbl_customers1 日に数回、クライアント レコードをループしています。

SELECT c.* FROM tbl_customers c

私は単に顧客のを返しています: customerid, name, phone,email

今奇妙な部分。電子メールの後に、さらに 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 つの個別のクエリを最初のクエリのループに合計するにはどうすればよいですか?

4

2 に答える 2

5

顧客と一緒に請求書を作成し、合計を計算するだけです。totalpaidとtotalowedを区別するには、SUM(CASEまたはwless1の回答が示すSUM(IFように使用できます

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でグループ化するだけで済みます。

于 2013-01-09T23:34:29.917 に答える
3

GROUP、、SUMおよびの組み合わせでこれを行うことができますIF

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

于 2013-01-09T23:35:25.497 に答える