where句を使用して3つのテーブルで左結合を実行しようとしていますが、機能させることができません。
私のテーブルは次のとおりです。
sale:
sale_id (int)
terminal_id (int)
zread_id (int)
... more fields about total amounts, dates times etc
sale_payment:
payment_id (int)
sale_id (int)
payment_type (enum: 'P','W','A')
method_id (int)
payment_amount (Decimal)
sale_writeoff_method:
method_id (int)
description (varchar)
display_order (int)
売上は、3つの異なる方法(したがって、列挙)で確定(支払い)できます。物理的な支払い-現金、小切手など、「償却」支払い-在庫が原価で使い果たされる場合(つまり、無駄、景品など)、またはアカウント-顧客クレジットなど
販売期間の終わり(1日の終わり)に、ユーザーはZ-Readを実行します。これにより、発生するすべてのトランザクションが収集され、レポートが生成されます。このレポートでは、ユーザーは引き出しなどの現金のバランスを取る必要があります。最初のZ-Readオブジェクト。クエリを使用して、必要な情報を収集できます。
SELECT m.method_id, m.description, SUM(s.sale_total) as z_total, COUNT(s.sale_id) as total_sales
FROM sale_writeoff_method m
LEFT JOIN sale_payment p ON m.method_id = p.method_id
LEFT JOIN sale s ON s.sale_id = p.sale_id
WHERE s.zread_id IS NULL
AND (p.payment_type = 'W' OR p.payment_type IS NULL)
AND (s.terminal_id = ? OR s.terminal_id IS NULL)
GROUP BY p.payment_type, m.method_id
ORDER BY m.display_order;
すべてのバランスが取れて確定すると、salesテーブル内のすべてのタイプについて収集されたすべての売上に、このオブジェクトの挿入の結果であるzread_idのフラグが付けられます。
今の私の問題は、将来z-readオブジェクトを再作成する必要がある場合、たとえばレポートを再印刷するために、すべてのmethod_idと説明を表示することができないということです-私が使用しているクエリは:
SELECT m.method_id, m.description, SUM(s.sale_total) as z_total, COUNT(s.sale_id) as total_sales
FROM sale_writeoff_method m
LEFT JOIN sale_payment p ON m.method_id = p.method_id
LEFT JOIN sale s ON s.sale_id = p.sale_id
WHERE s.zread_id = 1
AND (p.payment_type = 'W' OR p.payment_type IS NULL)
GROUP BY p.payment_type, m.method_id
ORDER BY m.display_order;
But it only displays methods that had sales attached for that Z-Read period. I can't use WHERE s.zread_id IS NULL because that will include all the sales that haven't been finalised yet.
任意の提案をいただければ幸いです!