(PHP, mysql) 店ごとの月の売上合計を出す為のSQL文の書き方を教えて頂きたいです

実現したいこと

店舗ごとに指定した月の売上合計(カラムmenu_price合計値)を一覧にしたいです。

発生している問題・分からないこと

formから条件(契約タイプと対象の月)を受けとり、その条件に合った店舗を店舗毎の対象月に入った予約件数と共に一覧表示する事はできたのですが、カラムmenu_priceの合計値を表示する事ができません。

  1. <form>で条件を受け取る
  2. その条件の店舗を(テーブル:shop、list)から取得
  3. 取得した店舗をforを使って表示
  4. forの中で店舗ごとの予約内容を(テーブル:customer3)から取得

この流れでできるかなと考えました。

menu_price合計値を取る為に

  • SUM(menu_price) AS P,
  • $rec = $prepare->fetch(PDO::FETCH_ASSOC);
  • echo "<p>".$rec['SUM(P)']."</p>";

を追加したのですが、うまく表示できません。

アドバイスを頂けると助かります。よろしくお願いします。

該当のソースコード

PHP

1<?php 2//エスケープ処理3function h($item) {4 if (is_array($item)) {5 return array_map("h", $item);6 } else {7 return htmlspecialchars($item, ENT_QUOTES);8 }9}10require_once( '../core/config.php' );11$thisMonth = date( 'n' );12$lastMonth = date('n', strtotime(date("Y-m-01") . ' -1 month'));13$twoMonth = date('n', strtotime(date("Y-m-01") . ' -2 month'));14$threeMonth = date('n', strtotime(date("Y-m-01") . ' -3 month'));15?>16<form method="post" action="">17<p class="item">18 <label>契約タイプを選択</label>19 <select name="type_of_contract" required>20 <option value="">選択してください</option>21 <option value="1">定額</option>22 <option value="2">都度</option>23 <option value="3">全て</option>24 </select>25</p>26<p class="item">27 <label>対象の月を選択</label>28 <select name="mode" required>29 <option value="">選択してください</option>30 <option value="thisMonth"><?php echo $thisMonth; ?></option>31 <option value="lastMonth"><?php echo $lastMonth; ?></option>32 <option value="twoMonth"><?php echo $twoMonth; ?></option>33 <option value="threeMonth"><?php echo $threeMonth; ?></option>34 </select>35</p>36<input type="submit" value="送信">37</form>38</div>39 40<?php41$_POST["mode"] == "";42 43$mode = h($_POST["mode"]);44$type_of_contract = h($_POST["type_of_contract"]);45if($type_of_contract == ""){46 $type_of_contract = "3";47}48try {49 // PDOインスタンスを生成50 $dbh = new PDO( DSN, DB_USER, DB_PASS );51 $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );52 53 $sql = "SELECT 54 s.shop_name, 55 s.shop_id, 56 s.created, 57 l.type_of_contract 58 FROM 59 shop s 60 INNER JOIN 61 list l 62 ON 63 s.shop_id = l.shop_id 64 where 65 NOT ( s.shop_id = 1 or s.shop_id = 2 or l.type_of_contract = 0 ) 66 ";67 switch ( $type_of_contract ) {68 case "1":69 $typeStr = "定額";70 $sql = $sql . " AND l.type_of_contract = 1 ORDER BY s.shop_id;";71 break;72 case "2":73 $typeStr = "都度";74 $sql = $sql . " AND l.type_of_contract = 2 ORDER BY s.shop_id;";75 break;76 case "3":77 $typeStr = "全て";78 $sql = $sql . " ORDER BY s.shop_id;";79 break;80 }81 82 $prepare = $dbh->prepare( $sql );83 $prepare->execute();84 $count = $prepare->rowCount(); //データ数を取得85 $rec = $prepare->fetchAll(PDO::FETCH_ASSOC);86 //var_dump($rec);87 88 echo "<h2>【".$typeStr."】件数:".$count."</h2>";89 90 for($i = 0; $i < $count; $i++){91 $shop_name = $rec[$i]['shop_name']; 92 $shop_id = $rec[$i]['shop_id']; 93 $type_of_contract = $rec[$i]['type_of_contract']; 94 //予約内容95 $sql = "SELECT 96 SUM(menu_price) AS P, 97 reserve_day, 98 start_time 99 FROM 100 customer3 101 WHERE 102 shop_id = :shop_id 103 ";104 switch ( $mode ) {105 case "thisMonth":106 $modeStr = $thisMonth . "月";107 $sql = $sql . " AND DATE_FORMAT(reserve_day, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') ORDER BY start_time";108 break;109 case "lastMonth":110 $modeStr = $lastMonth . "月";111 $sql = $sql . " AND DATE_FORMAT(reserve_day, '%Y%m') = DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y%m') ORDER BY start_time";112 break;113 case "twoMonth":114 $modeStr = $twoMonth . "月";115 $sql = $sql . " AND DATE_FORMAT(reserve_day, '%Y%m') = DATE_FORMAT(CURDATE() - INTERVAL 2 MONTH, '%Y%m') ORDER BY start_time";116 break;117 case "threeMonth":118 $modeStr = $threeMonth . "月";119 $sql = $sql . " AND DATE_FORMAT(reserve_day, '%Y%m') = DATE_FORMAT(CURDATE() - INTERVAL 3 MONTH, '%Y%m') ORDER BY start_time";120 break;121 }122 123 $prepare = $dbh->prepare( $sql );124 $prepare -> bindValue(':shop_id', $shop_id, PDO::PARAM_INT);125 $prepare->execute();126 $count_customer = $prepare->rowCount(); //データ数を取得127 $rec = $prepare->fetch(PDO::FETCH_ASSOC);128 129 130 echo '<p>契約タイプ:'.$type_of_contract.'</p>';131 echo '<p>('.$shop_id.')'.$shop_name.'</p>';132 echo '<p>'.$count_customer.'件</p>';133 echo "<p>".$rec['SUM(P)']."</p>";134 135 136 137 echo '<hr>';138 }139}catch ( PDOException $e ) {140 // エラーメッセージを表示させる141 echo 'データベースにアクセスできません!' . $e->getMessage();142 // 強制終了143 exit;144}finally{145 //データベース接続切断 146 $stmt = null;147 $dbh = null;148}149?>150

試したこと・調べたこと

上記の詳細・結果

SUM関数を使うと合計値を取得できる
PDO::FETCH_ASSOCを指定するとカラム名が添え字”となる配列で取得できる

補足

特になし

コメントを投稿

0 コメント