2016-08-16 30 views
-1

私は3つのテーブルを持っています。mysqlのすべての顧客の顧客の最終残高を選択する方法

table_customers - customer_id, name 
table_orders - order_id, customer_id, order_datetime 
table_wallet - customer_id, amount, type // type 1- credit, type 2- debit 

すべての顧客、合計残高、最終注文日、注文IDを取得する必要があります。これは私の質問です。

SELECT 
C.customer_id, 
C.name, 
COALESCE(SUM(CASE WHEN type = 2 THEN -W.amount ELSE W.amount END), 0) AS value, 
COALESCE(max(O.order_id ) , '0') AS last_order_id, 
COALESCE(max(date(O.order_datetime)) , '0000-00-00') AS last_order_date 
FROM 
table_customers as C 
LEFT JOIN 
table_wallet as W 
ON C.customer_id = W.customer_id 
LEFT JOIN 
table_orders AS O 
ON W.customer_id = O.customer_id 
group by C.customer_id 
ORDER BY C.customer_id 

お客様の合計金額を除いてすべてが正しいとされています。結果から、複数回追加されているようです。

クエリで何が間違っていますか?誰かが私にこれを助けることができますか?

+0

合計はどこですか?あなたは価値を意味しますか? http://www.sqlfiddle.com/でスキーマとレコードを作成できますか?その後、私はあなたを助けることができます – Mojtaba

+0

はい、その価値。私は質問を更新しました。 –

+0

お願いします。サンプルデータなしで手助けするのは簡単ではありません – Mojtaba

答えて

0

これはtable_customerstable_ordersで多対多の結合を行っています。これにより合計が失われます。むしろこれを実行します。

SELECT C.customer_id 
, C.name 
, IFNULL((SELECT SUM(IF(W.type=2, -1*W.amount, W.amount)) 
    FROM table_wallet W 
    WHERE C.customer_id = W.customer_id),0) AS value 
, IFNULL((SELECT MAX(DATE(O.order_id)) 
    FROM table_orders O 
    WHERE C.customer_id = O.customer_id),'0') AS last_order_id 
, IFNULL((SELECT MAX(DATE(O.order_datetime)) 
    FROM table_orders O 
    WHERE C.customer_id = O.customer_id),'0000-00-00') AS last_order_date 
FROM table_customers as C 
ORDER BY C.customer_id 

これは、顧客ごとに1行を返し、必要なフィールドをサブクエリします。 COALESCEの代わりにIFNULLを使用しましたが、これはきれいですが、これは優先事項です。

+0

お返事ありがとうございます。しかし、この条件のWHERE句でWHERE C.customer_id = W.customer_idのエラーが不明な列W.customer_idを与える –

+0

フィドルを作成しました。 sqlfiddle.com/#!9/560f2/1を確認してください –

+0

Oh derp、私はちょうど1つのサブクエリから貼り付けてエイリアスを変更するのを忘れた – tomb

関連する問題