2011-07-12 13 views
1

私が開発しているアプリケーションのレポート作成には、合理的に複雑なクエリを書いています。私は多分、より高いレベルのPHPを使って、以下の全てを達成することができましたが、明らかに、MySQLを使ってすべてを完了させたいと思います。MySQLの高度なサブクエリの繰り返し

私が必要とするレポートには、一般的な販売レポートタイプのクエリがあります。このクエリには、人物のリストとそれらに関連する関連合計が表示されます。唯一の小さな違いは、このシステムが貨物/運送に関連していることです。そのため、「販売員」は実際にトラック運転手であり、「販売」は個々の荷物です。また、荷物は、特定の日に何を配送/回収するかを記録する「ルート」の作成を通じて、それぞれの運転手にのみリンクされ/結ばれます。

当然ながら、私はINNER JOINを使用して、各ドライバのリストを取得し、それらが配送/収集したすべての荷物と、これらから得られた収入をSUMとすることができます。しかし、私は、合計配送収益収集収入の両方の列を表示する必要があるときに問題が発生します。これらの数値は、の委託番号テーブルから取得できます。このテーブルにはすべての委託が記載されています。各貨物は、貨物であろうと貨物であろうと寄付を行うフラグ(ENUM "D"、 "C")を有することができる。これは、サブクエリを使用することによってほぼ確実に確認できますが、それでも多くの繰り返しがあります。私がこれまで持って何

SELECT pr.driver_callsign, d.first_name, d.last_name, sum(pc.revenue) AS total_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

これは明らかに、彼らはそれらに縛られているすべての荷口から作られた収入の合計額で、各ドライバのリストを返します。

revenue SUMフィールドをさらに分割する最も効率的な方法は、SUM(revenue) WHERE type = "C"SUM(revenue) WHERE type="D"です。サブクエリ?連合?

最終クエリが日付範囲に絞り込まれることにも言及する価値があります。たとえば、pallet_routesテーブルに対して置かれたWHERE date BETWEEN x AND yがあります。

アドバイスをいただければ幸いです。私がもっと詳しく説明してほしいかどうか聞いてみてください。あなたのコラムtypeがどこにあるか

答えて

1

は私は知りませんが、それはpallet_consignments上にある場合、あなたは次のことを試すことができます。

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue, 
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

そうでない場合は、列typeがどこにあるか言及してください。

+0

お世話になりました。このようなものは理論的にはうまくいくはずですが、私は同意しますが、MySQLのインタプリタはそれを好きではありません: 'あなたはSQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が「SUM(IF(pc.'type' = 'D'、pc.revenue、0)」の近くで使用するようにしてくださいdelivery_revenue FROM pallet_routes 'at line 3' – George

+1

@ジョージ:前のSUMのコンマを忘れてしまった!更新されたクエリを試してください。 – Shef

+1

シェフ、返信いただきありがとうございます!更新されたクエリは完璧に動作します、ありがとうございます!それは私の心を越えていない私はそれらの結果を達成するためにそのようなIFを使用することができます! – George

関連する問題