2016-03-22 16 views
1

タイトルには、クエリから必要なものが十分に記述されていません。MySqlクエリを使用して、顧客の注文合計を選択します。

@sgeddesは、次のクエリを考え出すのに役立ちましたが、私のニーズを満たすためにクエリに変更が必要です。私はまた、削除された顧客を選択しないようにクエリを少し修正しましたが、このクエリが書かれている方法が私のSQL知識から外れているために変更することができませんでした。

SELECT d.customer_id,d.fname,d.lname,d.isactive, 
     o.lastdate, 
     Count(o2.order_id) AS 'total_orders' 
FROM customers d 
     LEFT JOIN (SELECT MAX(order_id) order_id, customer_id 
       FROM orders 
       GROUP BY customer_id) m on d.customer_id = m.customer_id 
     LEFT JOIN orders o on m.order_id = o.order_id 
     LEFT JOIN orders o2 on d.customer_id = o2.customer_id 
          AND o2.balance > 0 AND o2.isActive > -1 
WHERE d.user_id =945766 AND d.isActive > -1 
     AND o2.customer_id IS NULL 
GROUP BY d.customer_id 

次の3つの要件が必要です。 isActiveと

顧客のための
  1. カウント注文> -1(-1 =削除)受注テーブルの
  2. お客様ません(なし注文を顧客)。 isActive = 0とそれに対応するためで
  3. お客様は私が必要とするすべてはのisActive = 0と顧客であるので、簡単に

をカウントし、TOTAL_ORDERS列の実際の#を取得します。

私の要求を理解するための私の試みでは、私はSqlFiddleを作成しました。

Please see my SqlFiddle

+0

このクエリは他の目的のために設計されていますが、簡単なクエリが必要な場合でも編集することができます...あなたの要件は何かをお知らせください。 –

+0

3つの別々の結果に対して3つの別々のクエリが必要ですか? – Strawberry

+0

@strawberry。私はUNIONによってマージされた3つの別々のクエリを使用していました。以前のスレッドでsgeddesが提案したように、代わりにクエリのバージョンを使用しました。 – wilson382

答えて

0

あなたの要件は、あなたの3点に言及するものであるなら、あなたはあなたが別のクエリをしたい場合は、

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1 
GROUP BY d.customer_id; 

SELECT DISTINCT d.customer_id, d.fname 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL; 

SELECT d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id; 

below-使用queries-

の下に使用することができます組合で結合する場合は、以下を使用してください。

SELECT 'isactive>-1' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive > -1 
GROUP BY d.customer_id 
UNION ALL 
SELECT DISTINCT 'Customer without Order' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE o.customer_id IS NULL 
UNION ALL 
SELECT 'isactive=0' AS 'status', d.customer_id, d.fname, COUNT(o.order_id) AS Total_Orders 
FROM customer d 
LEFT JOIN orders o ON d.customer_id=o.customer_id 
WHERE d.isActive = 0 
GROUP BY d.customer_id; 

注:主なクエリは、他の目的に使用できる最新の命令をフェッチしようとしているため、正確な要件を提供する場合は、誰かがあなたを助けることができます。

+0

ご覧くださいhttp://postimg.org/image/5fy4fgs5j/ – wilson382

+0

マージ時に申し訳ありません私はmysqlターミネータを削除するのを忘れました ";"今すぐチェックしてください。 –

+0

あなたの質問は私の期待どおりの結果を返すので、私はあなたの答えを受け入れますが、最初のサブクエリーはo.isActive = -1(削除された注文)も同様にカウントしているので、 'AND o.isActive> -1'クエリ(注文のない顧客)はすべて消えてしまいます。 idkなぜ? – wilson382

関連する問題