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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2015/02/14 18:05:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141

ポイント500pt

横方向に項目数が可変になるデータを取得するには、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;
  }
id:corn_soup

具体的なコード、ありがとうございます!
とても参考になります。


>横方向に項目数が可変になるデータを取得するには、SQL は不向き

たしかにそれは今回痛感しました。
SQLだけでやろうとすると、かなりトリッキーなことをやらないと難しいですね。

2015/02/12 21:46:53
id:gizmo5

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

2015/02/13 12:54:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません