行いたいこと
下記のようなクロス集計を効率的に行いたいです。
A性別 | B身長 | C体重 | D摂取カロリー | E運動量 | F睡眠時間 | G起床時間 | H歩数 |
---|---|---|---|---|---|---|---|
男 | 167 | 62 | 4600 | 140 | 7 | 5 | 6500 |
男 | 187 | 75 | 3000 | 100 | 5.5 | 8 | 10000 |
女 | 154 | 44 | 2900 | 70 | 8 | 8 | 7000 |
女 | 169 | 50 | 3000 | 50 | 4.5 | 7 | 9000 |
女 | 160 | 53 | 3400 | 110 | 6 | 6 | 3500 |
性別グループごとに残りのB~Hすべての項目でクロス集計(平均の算出)をして
その差分(男性にほど特徴的)の大きい順に項目を並び替えたい。
※アウトプットイメージ※ ⇒男性特徴量(降順) 運動量>体重>歩数>摂取カロリー・・・
A性別 | E運動量 | C体重 | H歩数 | D摂取カロリー | B身長 | F睡眠時間 | G起床時間 |
---|---|---|---|---|---|---|---|
男グループ平均 | 120 | 69 | 8250 | 3800 | 177 | 6.3 | 6.5 |
女グループ平均 | 77 | 49 | 6500 | 3100 | 161 | 6.2 | 7.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文自体のコンパクトさではなく、システムの処理時間の面で示唆いただけると助かります。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー