• ベストアンサー

問い合わせ結果が得られるまでに時間がかかる?

延べ4000支店×12ヶ月間における商品1と商品2の売り上げを 150ある会社別に合計値を集計するSQL文で、phpMyAdmin経由で 問い合わせ結果が得られるまでに思ったより時間がかかる(体感時間で 2~4分くらい?)のですがそういうものなのでしょうか? ざっくり書くと次のようなもので、 SELECT KAISYACODE, SUM(URIAGE1) AS U1, SUM(URIAGE2) AS U2 FROM MYTABLE GROUP BY KAISYACODE 会社マスター、支店マスター、売り上げテーブルの3つから成り ます。 集計結果イメージ KAISYACODE   U1    U2 ------------------------------- 001   1556,782 343,451 002   2556,989 432,343 003   1456,799 349,213   :(略) 150   3556,980 433,343

  • MySQL
  • 回答数3
  • ありがとう数3

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

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

>ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。 ということは、150*5で750クエリ。 それは多すぎですね^^; SQL文を見直すか、設計を見直すべきでしょう。 下手にSQL発行するよりはPHP側で回したほうが早い場合もあります。

litton101
質問者

お礼

御礼遅くなりました。失礼しました。 やっぱそうですよね・・・ 貴重なコメントありがとうございました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

商品ごとにフィールドを持っているように見えますが これはさすがに非効率かとおもいます。 商品が追加変更されるたびにフィールドを増減させて いてはSQLとしてのデータアクセシビリティも よろしくありません。 それが速度の低下につながっているかどうかは わかりかねますが、通常データの持ち方であれば 以下のような形式の方がよくないでしょうか? 「会社コード,商品コード,売上」のような持ち方 をして、「SELECT `会社コード`,`商品コード`, SUM(`売上`) AS `売上` FROM `MYTABLE` GROUP BY `会社コード`,`商品コード`」 縦会社コード、横商品コードの表にするのは 受け取った側のミドルウェア、たとえばPHPなどで 処理すればよいかと思います

litton101
質問者

お礼

すみません、書き方が悪かったですが、商品ごとに もっているわけではありません。 でも、考え方は大変勉強になりました。 一応、専門業者さんが設計開発したPHP+MySQLシステムなので そのあたりは大丈夫なのですが、取り出す側(わたし) が悪いのだとは思います。 ともかく、貴重なアドバイスありがとうございました。

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

時間がかかりすぎのような・・・ データは何件くらい入っているのでしょうか? また、INDEXは使用していますか? ついでに、サーバの性能はどの程度でしょうか? SQL文はシンプルなので、サーバの処理能力の問題も考えられます。

litton101
質問者

お礼

貴重なアドバイスありがとうございました。 データの件数は、会社数マスター150、支店マスター4000、 売り上げテーブル12×4000程度です。 INDEXってMySQL4でつかえるのですか? (とはいえ私はINDEXという用語のみで使い方を知りませんが・・) サーバーは大手電話系会社の月2-3万程度のものです。 ひとつ気づいたのは、150社ごとにSQLを5種類を150回発行(ループ)しているので、プログラム側の効率的問題かもしれません。

関連するQ&A

  • SQL文(副問合せについて)

    SELECT URIAGE_NO FROM URIAGE AS U1 WHERE URIAGE_SURYO > (SELECT AVG(URIAGE_SURYO) FROM URIAGE AS U2 WHERE U1.HINMOKU_CODE = U2.HINMOKU_CODE); 上記SQLの構文で (SELECT AVG(URIAGE_SURYO) FROM URIAGE AS U2 WHERE U1.HINMOKU_CODE = U2.HINMOKU_CODE この部分の論理がわかりません。 書籍では「HINMOKU_CODEごとのURIAGE_SURYOの 平均を求める」ということですが、何故このように なるのかがわかりません。副問合せではGROUP BY句 が使えないので、非常に困っております。 下記にデータを記載致します。 以上、宜しくお願いします。 ■主問合せ URIAGE.NO HINMOKU_CODE URIAGE_SURYO 001 BP001 10 002 BP002 20 003 BP002 30 004 BP002 10 005 BP001 20 006 BP003 30 007 BP004 10 008 BP004 20 009 BP003 20 ■副問合せ HINMOKU_CODE AVG(URIAGE_SURYO) BP001 10 BP002 20 BP003 25 BP004 15 ■結果 URIAGE.NO HINMOKU_CODE  003 BP002 005 BP001 006 BP003 008 BP004

  • ピボットテーブル集計結果の並べ替えについて

    いつもお世話になります。 現在、Excel2010を使って以下のようなピボットテーブルを作成しています。      りんご  いちご  梨 支店A  40%   30%   30% 支店B  30%   20%   50% 支店C  50%   30%   20%  ・     ・    ・     ・  ・     ・    ・     ・ 支店ごとに、実際の売上の金額が大きく違うため、 「行集計に対する比率」で、各商品の売り上げ個数の比率を計算しています。 この中から、「りんご」の売上個数の比率が50%以上のデータのみを取り出したいのですが、 方法がわかりません。 条件付き書式を付ければ、50%以上のセルのみ色を付けることはできます。 「行ラベル」の「値フィルター」で、50%以上のデータを抽出しようとしましたが、できません。 どうやら、この「値フィルター」は、集計方法を「行集計に対する比率」に変更する前の集計結果 「売上個数」を見て、フィルターをかけているようです。 並べ替えも同様に、「売上個数」の合計の大きいものから順に並びます。 50%以上のデータを取り出、もしくは、「行集計に対する比率」の結果の大きいものから順に並べる方法を教えてください。 よろしくお願いします。

  • クエリで試験結果を個人ごとに集計したいのに??

    クエリで試験結果を個人ごとに集計したいのに?? Accessド素人です。例えば、商品別に売上金額の集計をしようとした場合、クエリで、「Σ」を押し、売上の合計欄を「グループ化」から「▼」から「合計」にすると商品ごとに集計が出る、と、思っています。 150人分の生徒の過去5回分の試験結果を集計したいのです。テーブルは「生徒マスター」「試験結果累積テーブル」ほかです。リレーションはうまくいってると思っています。 「Σ」ボタンを押して、試験の合計点数の「グループ化」を「合計」にして、「実行」したのですが、結局、個人ごとに集計できていないのです。何が間違っているのでしょうか? もしかして、大きな勘違いをしているのかも? とても心配です。どうか、よろしくお願いいたします。

  • エクセルで集計をしたいのです

    お世話になります。 Accessからエクスポートした表があります。 (集計元表) [商品名]|[支店名]|[日付]|[売上数]| 商品A|支店1|2011/08/01|6| 商品A|支店1|2011/08/05|2| 商品A|支店2|2011/08/01|3| 商品B|支店1|2011/08/01|9| 商品B|支店2|2011/08/01|1| … これを以下のように、商品毎に表にしたいのです。 (集計表:商品A) 商品A|8/1|8/2|8/3|8/4|8/5|合計| 支店1| 6 | 0 | 0 | 0 | 2 | 8 | 支店2| 3 | 0 | 0 | 0 | 0 | 3 | 合計 | 9 | 0 | 0 | 0 | 2 | 11 | (集計表:商品B) 商品A|8/1|8/2|8/3|8/4|8/5|合計| 支店1| 9 | 0 | 0 | 0 | 0 | 9 | 支店2| 1 | 0 | 0 | 0 | 0 | 1 | 合計 | 10 | 0 | 0 | 0 | 0 | 10 | 合計の行/列は最後にsumしますが、集計元表から 集計表カドの商品名、日付、支店を判別してセルに売上数を収める 手段のヒントを頂ければ幸いです。 セル関数でもVBAでもなんでも構いません。 宜しくお願いします。

  • GROUP BY関係で、こんなことはできませんか?

    例えば売上ファイル(Uriage)と経費ファイル(Keihi)があって、 売上ファイルの伝票No.に経費ファイルが複数行(0行、1行の場合もある) 関連付けられているとします。 売上伝票ごとに経費の合計も取得したい場合 SELECT Uriage.伝票No., SUM(Keihi.金額) AS 経費計 FROM Uriage, Keihi WHERE Keihi.伝票No. = Uriage.伝票No. GROUP BY Keihi.伝票No. というクエリを発行すると、 Uriageに関連付けられるKeihiの明細がある場合はいいのですが、 無い場合は結果が取得できません。 無い場合にも経費計=0で結果を取得する方法は無いでしょうか? わかりにくい説明ですみませんが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの書き方について

    下記のSQL文に科目マスタから科目名を取得する文を追加したいと考えてます。 色々と考えてみたのですが、私のスキルでは上手く行かなくて困っています。 どなたか教えて頂けないでしょう? 宜しくお願いします。 DB:アクセス97・アクセス2000 科目マスタ 科目CD  科目名 SELECT U.商品CD, 商品マスタ.商品名, U.[部署CD], 部署マスタ.部署名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,受払数) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.[部署CD], U.受払年月日, U.[SUM受払数] 科目名を取得する文を追加後のSQL文 SELECT U.商品CD, 商品マスタ.商品名, U.部署CD, 部署マスタ.部署名, U.科目CD, 科目マスタ.科目名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,科目CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,科目CD,受払数 ) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD ) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.部署CD, U.受払年月日, U.科目CD, U.SUM受払数 上記のSQLを実行するとエラーになります。 SQL実行中に以下のエラーが発生しました。 エラーコード:-3100 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD' の 構文エラー : 演算子がありません。 SQLステータス:37000 宜しくお願いします。

  • 【MySQL】SITEN_CODE毎の高速ランキン

    MySQL5.7でランキングの集計をしたいのですが、遅すぎて困っています。 URIAGEテーブルのSITEN_CODE毎にKINGAKU_RANKとKENSU_RANKを集計したい。 SELECT URIAGE.SITEN_CODE, URIAGE.SHAIN_BANGO, (SELECT COUNT(URIAGE2.KINGAKU) FROM URIAGE AS URIAGE2 WHERE URIAGE2.KINGAKU > URIAGE.KINGAKU AND URIAGE2.SITEN_CODE = URIAGE.SITEN_CODE)+1 AS KINGAKU_RANK, URIAGE.KINGAKU, (SELECT COUNT(URIAGE2.KENSU) FROM URIAGE AS URIAGE2 WHERE URIAGE2.KENSU > URIAGE.KENSU AND URIAGE2.SITEN_CODE = URIAGE.SITEN_CODE)+1 AS KENSU_RANK, URIAGE.KENSU FROM URIAGE ・件数が少ない内は動いたので、データ登録(約13万件) ・データ登録後、次のSQLで12時間動かしても終了しない。 という状態で困っています。 高速にランキング集計する方法があればご教授くださいm(_ _)m

  • SQL文で、合計が0のレコードを表示させないようにしたい。

    売上のテーブルがありまして、 数量の合計と金額の合計を出していたのですが、 数量の合計が0の場合は表示させないことになり、 下記のようにしてみたのですが、エラーになってしまいます。 かといって、Sum(売上マスタ.数量) <> 0 でもダメでしたし、どうしていいのか困っています。 どうぞ、ご教授よろしくお願いしますm(_ _)m SELECT Sum(売上マスタ.数量) AS 数量の合計, 売上マスタ.単価*数量の合計 AS 売上金額 FROM 売上マスタ Where 売上マスタ.数量 <> 0;

  • MySQLで対象期間を決め集計しランキングする方法

    MySQLの初心者ですが、対象期間で集計を行いランキング付けし任意の上位何位までを抽出する方法について教えてください。 全データから集計後上位5位を選ぶ場合・・同順有り select x.`品名`,x.kei,(select count(*)+1 from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) y where x.kei<y.kei ) as rank from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) x having rank <= 5 order by rank といろいろ参考にしてで出来ましたが。任意の対象期間(日付)を設定して実行するSQL文が思いつきません。どこに期間を挿入するのか・・・悪あがきで思い付いた方法として CREATE OR REPLACE VIEW uriage_01 AS SELECT `品名`,SUM(`金額`) AS `金額` FROM uriage WHERE `日付` BETWEEN "2001/01/01" AND "2001/01/31" GROUP BY `品名` で任意期間の集計結果のビューを作りそのビューから select r1.`品名` as `品名`, r1.`金額` as p, count(r2.`金額`)+1 as rank from uriage_01 as r1 left join uriage_01 as r2 on r1.`金額` < r2.`金額` group by r1.`品名` having rank <= 5 order by rank と手間の掛かる方法です。単純に5行だけに限定ならorder by `金額`Limit 5 にすれば良いだけですけど・・・同順があるとどうすれば良いのかと思考停止状態です。尚、当方は、MySQLの勉強を始めたばかりにですので宜しくお願いいたします

    • ベストアンサー
    • MySQL
  • クロス集計の結果を元に戻す方法

    Accessで以下のようなクロス集計を作成したのですが、元データを消してしまいました。 クロス集計の結果はエクセルで残っているのですが 元データを生成する良い方法は無いでしょうか どなたかご存知でしたらご教授下さい。 よろしくお願いいたします。 クロス集計結果 商品名 営業所1売上 営業所2売上 ・・・・・・ 商品1  100   200    ・・・・・・  商品2    0    50    ・・・・・・ 商品3   50    10    ・・・・・・ 元データ形式 商品名 営業所名  売上 商品1 営業所1 100 商品1 営業所2 200 商品2 営業所1   0 商品2 営業所2  50 商品3 営業所1  50 商品3 営業所2  10 ・・・・・・・・・・