0

この質問は私の以前の投稿に関連しています:MySQL-クエリ内の複雑なSUM

クエリはうまく機能しており、必要に応じて合計を合計しています。NULL値のレコードもすべて無視されることに気付きました。

現在のクエリ:

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

そしてそれは美しく10の顧客記録を返します。データベースを確認すると、 11tbl_customers_billsの顧客レコードが表示され、11番目のレコードにはテーブル内に相関するレコードがありません。

tbl_customers_billsテーブルに存在しないレコードがある場合でも、11個すべてを返したいのですが。(ただし、もちろんゼロを使用します)

私はそのような状態がどれほど複雑になる可能性があるかで立ち往生しています。これが私が試したことです:(役に立たない)

SELECT c.*,

     (CASE WHEN (total IS NULL) THEN totalpaid = 0

       ELSE
        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
      END)

FROM 
    tbl_customers c
    LEFT JOIN tbl_customers_bills  b
    ON c.customerid = = b.customerid
     and billtype in (1,2)
GROUP BY 
     c.customerid
4

2 に答える 2

2

私は完全にそうかもしれませんが、あなたはただ行方不明だと思いますCOALESCE

SELECT c.*,
       COALESCE(SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END), 0) totalpaid ,
       COALESCE(SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END), 0 totalowed ,
       COALESCE(SUM(total), 0) 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リファレンスから

COALESCE(値,...)

リスト内の最初の非 NULL 値を返します。非 NULL 値がない場合は NULL を返します。

mysql> SELECT COALESCE(NULL,1); -> 1
mysql> SELECT COALESCE(NULL,NULL,NULL); -> ヌル

于 2013-01-17T07:30:28.437 に答える
1

ifnull を行うのはどうですか

SELECT 
    c.*,
    SUM(CASE WHEN billtype = 1 THEN IFNULL(total,0) ELSE 0 END) totalpaid ,
    SUM(CASE WHEN billtype = 2 THEN IFNULL(total,0) 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
于 2013-01-17T07:25:56.947 に答える