1

すべての顧客レコードを取得し、その顧客 (points_audit_customers.id = points_audit_documents._audit_id) に一致するドキュメントを見つける次の SQL がありますが、一致するドキュメントがないすべての顧客をスキップしています。当初は問題ありませんでしたが、現在は仕様が変更されており、すべての顧客が来る必要があります。ドキュメントが見つからない場合でも、顧客の詳細を表示しますが、SQL のドキュメント フィールドはゼロまたは null のままにしておきます。

これは可能ですか?どういうわけかCASEを使用できないかと思っていましたか?SQL を変更して顧客の詳細のみを選択することができない場合は、PHP ループで一致するドキュメントを選択できます。できれば SQL ステートメントを使用することをお勧めします。

ありがとうございました

SELECT points_audit_customers.*, points_audit_documents.branch,
SUM(points_audit_documents.amount_invoiced) AS the_amount_invoiced,
SUM(points_audit_documents.amount_spent) AS the_amount_spent,    
SUM(points_audit_documents.points_invoiced) as invoiced_points,  
SUM(points_audit_documents.points_spent) as spent_points,
SUM(points_audit_documents.points_bonus) as bonus_points
FROM points_audit_customers, points_audit_documents
WHERE import_month = '$import_month'
AND points_audit_customers.id = points_audit_documents.audit_id
AND processed = 1
4

2 に答える 2

3

外部結合を使用する必要があります:

FROM  points_audit_customers LEFT JOIN points_audit_documents
        ON points_audit_customers.id = points_audit_documents.audit_id
WHERE import_month = '$import_month'
  AND processed = 1  -- if this is in documents table, move to the join criteria
于 2013-04-29T23:00:40.443 に答える
0
SELECT pac.*, pad.branch,
    IFNULL(SUM(pad.amount_invoiced), 0) AS the_amount_invoiced,
    IFNULL(SUM(pad.amount_spent), 0)    AS the_amount_spent,    
    IFNULL(SUM(pad.points_invoiced), 0) AS invoiced_points,  
    IFNULL(SUM(pad.points_spent), 0)    AS spent_points,
    IFNULL(SUM(pad.points_bonus), 0)    AS bonus_points
FROM points_audit_customers pac 
LEFT JOIN points_audit_documents pad ON ( pad.id = pac.audit_id )
WHERE processed = 1
    AND import_month = '$import_month'
GROUP BY pac.id
于 2013-04-29T23:08:25.867 に答える