PHP+MySQLでクロス集計は出来ますか?

このQ&Aのポイント
  • PHPとMySQLを使用して、年ごとに月別の売り上げデータを集計する方法について質問しました。
  • 具体的なテーブル構造と希望する出力画面を提示し、どのようにデータを表示すれば良いか悩んでいます。
  • ご指導いただけると幸いです。
回答を見る
  • ベストアンサー

PHP+MySQLでクロス集計は出来ますか?

こんばんは。 いつもお世話になっております。 検索して調べてみたのですが、見つからなかったので 質問させていただきました。 どうか、ご指導よろしくお願いいたします。 syouhin_tb(商品テーブル) syouhin_id syouhin_name siiresaki_id uriage_tb(売り上げテーブル) uriage_id nen tuki syouhin_id uriage_kingaku tanka uriage_kazu という、二つのテーブルから ---------------------------------------- nen ┃tuki┃syouhin_name┃uriage_kingaku┃tanka┃uriage_kazu ------------------------------------------ 2005┃ 01 ┃ コサージュA┃    1000   ┃ 500 ┃2 2005┃ 02 ┃ コサージュA┃    1500   ┃ 500 ┃3 <略> というところまでは出来たのですが、これを年ごとに 月別で表に出力する事は可能なのでしょうか・・・? 【希望出力画面】 -------------------------------------------------- 2005年売り上げ表 syouhin_name┃  1月    ┃  2月    ┃・・ コサージュA ┃1000┃500┃2┃1500┃500┃3┃・・ コサージュB ┃3600┃400┃9┃2000┃400┃5┃・・ よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

間違っているかもしれないけども。 SELECT nen,tuki,syouhin_name,uriage_kingaku,tanka,uriage_kazu from uriage_tb LEFT JOIN syouhin_tb ON uriage_tb.syouhin_id = syouhin_tb.syouhin_id GROUP BY uriage_tb.syouhin_id,CONCAT(nen,tuki) ORDER BY CONCAT(nen,tuki); とすれば nen | tuki | syouhin_name | uriage_kingaku | tanka | uriagekazu 2005| 02 | コサージュA |    1000   |  500 |   2 という風に表示されると思います。

sibazuke
質問者

お礼

こんにちは。 ご指導頂いているのに、気がつかず、お礼が 遅くなってしまって、大変もうしわけありません でした・・・。 ご指導ありがとうございます。 教えて頂いた方法ですと、年・月が縦に並んで行くので ぱっと見た時に、こさーじゅAなどの商品名も 縦にざーっと並んでしまって、他の商品が何月に どれだけ売れてて、この商品が、何月にどれだけ売れた のか、という見比べがしにくいかな、と思うのです。 一つの商品に対する、月別集計を、縦 商品名 横 年月 という形に出したいのです。 書き込みをしてから、私なりに調べてみていたのですが まずは、月ごとの商品売り上げ数だけを、商品ごとに 月別集計表として出そうとしてみたのですが、 【↓希望表示方法】 -------------------------------------------- 商品名│1月│2月│3月│・・・ --------------------------------------------- コサA│ 0│ 2│15│・・・ ----------------------------------------- という形に、SQL文だけで出すのは、かなり 難問のように思いました。 なので、 『  $a 』年度(yyyyで入力) -------------------------------------------- 商品名│1月│2月│3月│・・・ ---------------------------------------------  $sh1│ $1 │$2  │$3  │・・・ ----------------------------------------- <略> ※50行まで作成 という空のテーブルを、まずHTMLで作って置いて、 my_sql_fetch_arryで、一件ずつ取得したカラムを if分を使って、月と同じなら$1に値を入れる、月と 違っていたら、なにも返さない、という処理を 繰り返させたらどーだ! なんて思ってやってみようと していたのですが、よーく考えると -------------------------------------------- 商品名│1月│2月│3月│・・・ --------------------------------------------- コサA│  │  │  │・・・ ----------------------------------------- コサA│  │ 2│  │・・・ ----------------------------------------- コサA│  │  │15│・・・ ----------------------------------------- になるので、意味がない・・・・と、うなだれて しまいました・・・。 何か良い方法は、ないものなのでしょうか・・・。

sibazuke
質問者

補足

すみません。まだちゃんとPHPの基礎部分が 頭に入っていなかったみたいで、SQL文で 縦に吐き出されていても、PHPで 横並びで表示するようにしたら良いのだと いうことに、やっと理解できるようになりました。 ご指導、ありがとうございました。

関連するQ&A

  • MySQLについてお願いします。

    下記の2つのテーブルより、各顧客が最後に売れた日を抽出したいのですがうまくいきません。 顧客テーブル kokyaku_id kokyaku_name 1 aaa 2 bbb 3 ccc 4 ddd 売上テーブル uriage_date kokyaku_id kingaku 2000-1-1 1 100 2011-12-1 2 200 2010-2-2 2 300 2009-3-1 1 50 2006-5-29 3 300 2007 3 400 2012-9-20 3 100 kokyaku_name | uriage_date aaa | 2009-3-1 bbb | 2011-12-1 ccc | 2012-9-20 顧客dddは売上がないので当然結果には出てこなくてOKです。 何結合でどのようなクエリにすればよろしいでしょうか。 まだDBを初めて2週間なので、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • 集計のSQL文を教えてください

    集計で困っています。 助けてください。 uriage_date(date型) uriage_kingaku 2005/01/01 00:15   2000 2005/01/01 12:20   2500 2005/01/02 00:00   1000 ←ここは前日分(2005/01/01)に 2005/01/02 05:15   1800 2005/01/04 12:30   2300 ~ 2005/12/31 20:20   5000 2005/12/31 22:45   1200 上の様なテーブルから 売上合計(1月分) uriage_date     goukei_kingaku 2005/01/01      5500 2005/01/02      1800 2005/01/03      0 ~ 2005/01/31      9000 この様に1日毎(当日00:01~翌日00:00)の売上の合計金額 を一ヶ月単位で集計したいのですが、SQL文が解りません。 00:00の売上は前日の合計に入れたいです。 データの無い日も0円として欲しいです。 よろしくおねがいします。

  • SQLについて質問します

    VB2010 とSQL Server2008 R2 で開発をしています。 担当者テーブル(table_tanto)と売上明細テーブル(table_uriage_meisai)があります。 各テーブルのカラムは以下です。 table_tanto ・tanto_id ・tanto_name table_uriage_meisai ・meisai_id ・tanto_id ・kingaku ・date ある期間の担当者別の売上実績を一覧で出力したいと考えています。 「table_uriage_meisai」の「date」で範囲指定したいと思います。 結果はこんな形を望んでいます。 担当者ID 担当者名 売上合計 0001   ○○○   ****** 0002   □□□      0 0003   △△△   ****** 0004   ●●●   ****** 2点質問があります。 売上の無かった担当者も含めてすべての担当者の一覧を出したいと考えています。 そのSQlがわからないのと、売上がなかった担当者はその列がNullになってしまうと思うんですが、後の計算で困ります。 Nullのときゼロを返すようにするにはどうしたらよいでしょうか。 以上2点について教えて下さい。 よろしくお願いします。

  • SQLの質問です。

    SQLの質問です。 SQL Server 2008 R2 を使っている初心者です。 下の2つのテーブルがあります。 1)売上情報 table_uriage ・uriage_id ・user_id ・uriage_date ・uriage_kingaku 2)入金情報 table_nyukin ・nyukin_id ・user_id ・nyukin_date ・nyukin_kingaku この2つのテーブルに対して、同じ期間を指定して、集計表(ユーザー毎の合計)を 作りたいと思っています。別々の表にするには何の問題もないのですが、 問題は2つのSQLの結果を1つの表にしたいのですが、SQLをどのように組んだらいいか わかりません。 具体的な表としては、 user_id uriage_total nyukin_total ======================================== 001 11111 22222 002 33333 44444 003 55555 66666 みたいな感じになればいいのです。 どなたか教えて下さい。 よろしくお願いいたします。

  • 複数テーブルのGROUP BY の使い方を教えて下さい。

    いつもお世話になっております。 3日悩んだのですが、どうにもわからないので 投降させて頂きました。 どうかご指導よろしくお願いいたします。 二つのテーブルがあります テーブル名(uriage) uriage_id syouhin_id year 1gatu 2gatu 3gatu 4gatu 5gatu 6gatu 7gatu 8gatu 9gatu 10gatu 11gatu 12gatu テーブル名(syouhin) syouhin_id siiresaki 求めたい情報 year │siiresaki │1gatu │2gatu │3gatu…… GROUP BY を使えばよいのかなと思って下記の SQL文で試してみました。 SELECT year,syuhin_is,1gatu,2gatu…(略)12gatu FROM uriage,syouhin WHERE uriage.syouhin_id = syouhin.syouhin_id GROUP BY siiresaki ORDER BY syouhin.siiresaki,uriage.year すると、仕入先でグループ化はされたのですが、 年度まで一緒にグループ化されてしまうのです。 年度ごとの、仕入先でグループ化して、 それぞれの月ごとで加算させるには どのようにしたら良いのでしょうか・・・? SUMもいるのだ、と思って下記の文でも 試してみたのですが、こちらはエラーが返ってきました。 SELECT year,siiresaki SUM(1gatu,2gatu…(略)12gatu) FROM uriage,syouhin WHERE uriage.syouhin_id = syouhin.syouhin_id GROUP BY (year,siiresaki) どうかご指導よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • phpmyadminでのデータ挿入について

    phpmyadmin(ver3.4.9)を利用しています。 リレーションビューを用いて、以下のようなリレーションを組んだとします。 【商品テーブル】 id name 【売上テーブル】 syouhin_id uriagegaku ※商品テーブルのidと、売上テーブルのsyouhin_idがリレーション 売上テーブルのデータ挿入において、 現在は、syouhin_idのセレクトボックスには、 商品テーブルのidの値が出てきます。 これだと何の商品かよくわからないため、 データ挿入の効率を上げるため、 syouhin_idのセレクトボックスに商品名(nameの値)が出るような方法はありますでしょうか。 あくまでも、データ挿入時に商品名を参照したいのであって、 実際のデータは商品id(idの値)をsyouhin_idに入れたいのです。 つたない説明ですが、ご教授ください。 社内プログラマが急病のため、 プログラムを組んだりすることができず、 phpmyadmin画面内でのデータ挿入となりました。 なにとぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • phpmyadminからphpに読み込ませて配列化

    現在phpmyadminからphpに読み込みこんで配列化する勉強をしています。 syouhinテーブルの中にid name priceというものを用意しています。 $recordSet = mysql_query('SELECT * FROM syouhin'); while($data = mysql_fetch_assoc($recordSet)) { echo $data['id'],$data['name'],$data['price']; } このようにすれば用意しているもの、例えばidが1、nameがバナナ,priceが200、idが2、nameがバナナ,priceが200・・・・と全部でてくると思います。 これは$dataにこれらが入っているのだと思うですが、idが1のものをsyouhin1に格納しidが2のものをsyouhin2に格納するようにしたいのですがどうしたらいいでしょうか? すみません説明がへたくそでして。 プログラムは授業で勉強したばかりで配列が弱いので、丁寧に教えて頂けると嬉しいです。 ここの勉強もしておくべきという場所もありましたら教えて頂けると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLに評価の集計をしている場合CSVでの更新

    例としまして、下記のようなテーブルがあるとします。 ┼─┼───┼──┼────┼ │ID│NAME│KAZU│HYOUKA│ ┼─┼───┼──┼────┼ │0 │アイドル│30 │1500   │ ┼─┼───┼──┼────┼ │1 │アクター│15 │2000   │ ┼─┼───┼──┼────┼ │2 │オペラ│5  │4000  │ ┼─┼───┼──┼────┼ カラム:ID・NAME・KAZU のデータは、更新の際、CSVでインポートを考えています。 カラム・HYOUKA は、外部からクリックで評価してもらった数を集計しようと考えています。 データのみのDB、評価の集計のみのDBはできるのですが、 これを両方兼ねたデータベースを作ってPHPで表示し、更新があったらCSVでインポートした場合、 「HYOUKA」の数をそのままでということは可能なのでしょうか。 こういった場合、テーブルを別に作って…など、上記とは違った方法を取るのが正しいのでしょうか。

    • ベストアンサー
    • MySQL
  • SQL Server を使っています。SQLの質問です。

    SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID  (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================   1     aaa     001     100     2010/01/01   2     aaa     002     200     2010/01/01   3     bbb     001     105     2010/01/02   4     bbb     002     205     2010/01/02   5     ccc     001     110     2010/01/03   6     ccc     002     210     2010/01/03   7     aaa     001     100     2010/01/04   8     aaa     002     200     2010/01/04   9     bbb     001     105     2010/01/05   10     bbb     002     205     2010/01/05   11     ccc     001     110     2010/01/06   12     ccc     002     210     2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。   7     aaa     001     100     2010/01/04   9     bbb     001     105     2010/01/05   11     ccc     001     110     2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。

専門家に質問してみよう