人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで売り上げ集計表を取得するクエリについて質問です。

このようなテーブル構成で、
「特定の日付の顧客一覧および商品の売り上げ数量一覧」
の表を取得したいと考えています。

その日の注文が無い客も含めて、一覧表で取得したいです。

たとえば、今日の売り上げが知りたいとき、
最終的には以下のような表(table)としてHTML出力したいのですが、
SQL一発でこの状態のデータを取り出すのは無理でしょうか?
SQLまたはPHPでどのように加工したら望みの結果が得られますでしょうか。

顧客ID 顧客名 注文日 ドライバー スパナ 合計金額
001 海山商事 2015-02-10 3 0 1500
002 会社あ (空白) (空白) (空白) (空白)
003 会社い (空白) (空白) (空白) (空白)
004 三角運送 2015-02-10 1 2 1100

※はてなの文字数縛りがキツイため、テーブル構造や試したクエリなど質問全文は下記をご参照下さい。
https://teratail.com/questions/6554

●質問者: corn_soup
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● gizmo5
●500ポイント ベストアンサー

横方向に項目数が可変になるデータを取得するには、SQL は不向きです。
商品の数は固定ではないでしょうから、PHP で集計することになると思います。
PDO を使った場合には以下のようなコードで集計できると思います。

 $sql = new PDO($dsn, $user, $password);
 $stmt = $pdo->query(質問のSQL...);

 $data = array();
 while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
 $client_id = $result['顧客ID']);
 if (array_key_exists($data, $client_id)) {
 $record = $data[$client_id];
 $count = $record['売上'];
 $sum = $record['金額'];
 } else {
 $count = array();
 $sum = 0;
 $record = array(
 '顧客ID' => $result['顧客ID']),
 '顧客名' => $result['顧客名']),
 (省略)
 '売上' => $sold,
 '金額' => $sum
 );
 }

 $name = $result['商品名'];
 if (array_key_exists($sold, $name)) {
 $count[$name] = $count[$name] + $result['数量'];
 } else {
 $count[$name] = $result['数量'];
 }
 $sum = $sum + $result['価格'];

 $record['売上'] = $count;
 $record['金額'] = $sum;
 $data[$client_id] = $record;
 }

corn_soupさんのコメント
具体的なコード、ありがとうございます! とても参考になります。 >横方向に項目数が可変になるデータを取得するには、SQL は不向き たしかにそれは今回痛感しました。 SQLだけでやろうとすると、かなりトリッキーなことをやらないと難しいですね。

gizmo5さんのコメント
私なら、注文テーブルから日付で select して、id と名前を join でくっつけて、商品ID で group by します。 現実には、注文テーブルが一番サイズが大きくなると思うので、一番大きなテーブルから select するほうがチューニングがしやすいです。 取引がなかった顧客名は検索結果に入りませんけれども、データを編集すると思えば、顧客テーブルから全顧客を取り出して、注文テーブルから select した結果と突き合わせます。 回答では検索結果を配列に入れるようにしましたが、この場合は注文テーブルからの検索結果は、顧客ID がキーになるような連想配列にしておけば、引き当ては簡単です。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ