このようなテーブル構成で、
「特定の日付の顧客一覧および商品の売り上げ数量一覧」
の表を取得したいと考えています。
その日の注文が無い客も含めて、一覧表で取得したいです。
たとえば、今日の売り上げが知りたいとき、
最終的には以下のような表(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
横方向に項目数が可変になるデータを取得するには、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; }
具体的なコード、ありがとうございます!
2015/02/12 21:46:53とても参考になります。
>横方向に項目数が可変になるデータを取得するには、SQL は不向き
たしかにそれは今回痛感しました。
SQLだけでやろうとすると、かなりトリッキーなことをやらないと難しいですね。
私なら、注文テーブルから日付で select して、id と名前を join でくっつけて、商品ID で group by します。
2015/02/13 12:54:51現実には、注文テーブルが一番サイズが大きくなると思うので、一番大きなテーブルから select するほうがチューニングがしやすいです。
取引がなかった顧客名は検索結果に入りませんけれども、データを編集すると思えば、顧客テーブルから全顧客を取り出して、注文テーブルから select した結果と突き合わせます。
回答では検索結果を配列に入れるようにしましたが、この場合は注文テーブルからの検索結果は、顧客ID がキーになるような連想配列にしておけば、引き当ては簡単です。