質問するログイン新規登録
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

1455閲覧

MySQL: 大量のクロス集計を効率的に行うためのSQL文

s.wad

総合スコア8

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2018/12/05 04:33

0

1

行いたいこと

下記のようなクロス集計を効率的に行いたいです。

A性別B身長C体重D摂取カロリーE運動量F睡眠時間G起床時間H歩数
167624600140756500
1877530001005.5810000
15444290070887000
169503000504.579000
160533400110663500

性別グループごとに残りのB~Hすべての項目でクロス集計(平均の算出)をして
その差分(男性にほど特徴的)の大きい順に項目を並び替えたい。

※アウトプットイメージ※  ⇒男性特徴量(降順) 運動量>体重>歩数>摂取カロリー・・・

A性別E運動量C体重H歩数D摂取カロリーB身長F睡眠時間G起床時間
男グループ平均12069825038001776.36.5
女グループ平均7749650031001616.27.0
男性特徴量(降順)1.6倍1.4倍1.3倍1.2倍1.1倍1.0倍0.9倍

お伺いしたいこと

実際には、カラム数:数百件 × レコード数:数万件の規模のテーブルでの
クロス集計を想定しています。
MySQLは最近学習し始めたばかりで、クロス集計のケースでシステム負荷(処理時間)を考慮したSQL文の書き方が分かっておりません。

select
sex_name
,AVG(case~略~) as "B身長"
,AVG(case~略~) as "C体重"
,AVG(case~略~) as "D摂取カロリー"
,AVG(case~略~) as "E運動量"
,AVG(case~略~) as "F睡眠時間"


from
table_name
group by
sex_name

のように延々とカラムの数だけ同じ処理を書き連ねることしか思いついておりません。
何か良い工夫・アドバイスなど頂けると大変助かります。
※SQL文自体のコンパクトさではなく、システムの処理時間の面で示唆いただけると助かります。

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssasaki

2018/12/05 04:43

,AVG(case~略~) as "B身長" と記載がありますが、なぜcase文が必要になるのでしょう?特定のデータはカウントしないといったような記載の無い条件があるのでしょうか?
s.wad

2018/12/07 02:54

仰る通り例外処理のために記載しておりましたが、今回の質問の趣旨においては些末なSQL文でした。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

必要になってからクエリを発行するより、あらかじめ必要な各カラムの平均値をviewで作成しておくのはいかがでしょうか。
必要になった時はviewをselectするだけなので処理時間は気にならなくなります。

Mysqlでクエリの処理時間が気になるのでしたら、Explainでクエリを解析してみてください。

投稿2018/12/05 12:01

asahiyou

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.wad

2018/12/07 02:56

仰るように平均値を事前に持っておくことが一番の得策ですね。アドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問