裏MySQL ユーザー変数を使って合計と平均も同時に計算する その2
ユーザー変数を使って、合計と平均を同時に出す場合は以下のとおり
SELECT '00000/00/00' `report_date`, 0 `imp`, 0 `click`, 0 `action`, 0.00 `ctr`, 0.00 `cvr`, 0 `revenue` FROM DUAL WHERE @imp:=0+@click:=0+@action:=0+@revenue:=0 UNION ALL SELECT `report_date` , `imp` +(@imp :=@imp + `imp` )*0 , `click` +(@click :=@click + `click` )*0 , `action` +(@action :=@action + `action`)*0 , cast(click * 100/imp as decimal(3,2)), cast(action * 100/imp as decimal(3,2)), `revenue`+(@revenue:=@revenue + `revenue`)*0 FROM report UNION ALL SELECT '合計/平均', cast(@imp as unsigned), cast(@click as unsigned), cast(@action as unsigned), cast(@click * 100/@imp as decimal(3,2)), cast(@action * 100/@imp as decimal(3,2)), cast(@revenue as unsigned)
report_date | imp | click | action | ctr | cvr | revenue |
2011-12-01 | 12125 | 315 | 15 | 2.60 | 0.12 | 200 |
2011-12-02 | 32132 | 615 | 40 | 1.91 | 0.12 | 612 |
2011-12-03 | 22545 | 345 | 11 | 1.53 | 0.05 | 315 |
2011-12-04 | 28012 | 451 | 30 | 1.61 | 0.11 | 425 |
2011-12-05 | 17122 | 315 | 17 | 1.84 | 0.10 | 375 |
2011-12-06 | 16212 | 275 | 11 | 1.70 | 0.07 | 285 |
2011-12-07 | 21454 | 487 | 33 | 2.27 | 0.15 | 448 |
2011-12-08 | 41212 | 811 | 64 | 1.97 | 0.16 | 777 |
2011-12-09 | 12151 | 301 | 11 | 2.48 | 0.09 | 285 |
2011-12-10 | 21451 | 412 | 22 | 1.92 | 0.10 | 385 |
2011-12-11 | 17151 | 260 | 14 | 1.52 | 0.08 | 275 |
2011-12-12 | 23712 | 612 | 39 | 2.58 | 0.16 | 555 |
2011-12-13 | 37121 | 701 | 40 | 1.89 | 0.11 | 657 |
2011-12-14 | 41212 | 744 | 74 | 1.81 | 0.18 | 800 |
2011-12-15 | 12141 | 160 | 10 | 1.32 | 0.08 | 125 |
2011-12-16 | 15101 | 201 | 10 | 1.33 | 0.07 | 175 |
2011-12-17 | 24121 | 317 | 38 | 1.31 | 0.16 | 488 |
2011-12-18 | 32128 | 815 | 66 | 2.54 | 0.21 | 715 |
2011-12-19 | 51215 | 888 | 89 | 1.73 | 0.17 | 981 |
2011-12-20 | 36454 | 511 | 41 | 1.40 | 0.11 | 488 |
2011-12-21 | 12155 | 304 | 25 | 2.50 | 0.21 | 285 |
合計/平均 | 526927 | 9840 | 700 | 1.87 | 0.13 | 9651 |
ざっくり説明すると、UNION ALL で3つの部分に分かれています。はじめは、ユーザー変数の初期化とカラム名の初期化、次にメインのSQL、最後に合計と平均です。
はじめのSQLでWHERE句にユーザ変数の初期化が書かれているのはWHERE 0として行を表示させないようにさせている為です。つまり、WHERE 0とするとカラムに処理が移らないため、カラムの方にユーザ変数の初期化を書くと処理されないからです。つまり、UNION ALLされていますが、WHEREが0になるので、ユーザー変数の初期化とカラム名の設定だけで全く表示されない行になります。表示されないので、カラムの値はダミーで、カラムの型さえあっていれば、なんでも構いません。カラムの数と型が合っていて、カラム名が定義できればよいということです。
メインのSQLでそれぞれのカラム用に用意したユーザー変数に足しこみを行っています。
最後は、ユーザー変数を使った合計や平均の表示部分ですが、SQL中で変数を初期化した場合ユーザー変数の型がBINARYとなってしまうため、適切にCASTをしてあげる必要があります。
最後にフォーマットを整形したものは以下のとおりです。
SELECT '00000/00/00' `日付`, 0 `インプレッション数`, 0 `クリック数`, 0 `アクション数`, 0.00 `クリック率`, 0.00 `コンバージョン率`, 0 `収益` FROM DUAL WHERE @imp:=0+@click:=0+@action:=0+@revenue:=0 UNION ALL SELECT date_format(`report_date`,'%Y年%m月%d日') , concat(`imp` ,' 回' ), concat(`click` ,' click' ), concat(`action` ,' action'), concat(cast(click * 100/imp as decimal(3,2)),' %'), concat(cast(action * 100/imp as decimal(3,2)),' %'), concat(`revenue`+ (@imp :=@imp + `imp` )*0 + (@click :=@click + `click` )*0 + (@action :=@action + `action`)*0 + (@revenue:=@revenue + `revenue`)*0 , ' 円') FROM report UNION ALL SELECT '合計/平均', concat(cast(@imp as unsigned),' 回' ), concat(cast(@click as unsigned),' click' ), concat(cast(@action as unsigned),' action'), concat(cast(@click * 100/@imp as decimal(3,2)),' %'), concat(cast(@action * 100/@imp as decimal(3,2)),' %'), concat(cast(@revenue as unsigned) , '円')
日付 | インプレッション数 | クリック数 | アクション数 | クリック率 | コンバージョン率 | 収益 |
2011年12月01日 | 12125 回 | 315 click | 15 action | 2.60 % | 0.12 % | 200 円 |
2011年12月02日 | 32132 回 | 615 click | 40 action | 1.91 % | 0.12 % | 612 円 |
2011年12月03日 | 22545 回 | 345 click | 11 action | 1.53 % | 0.05 % | 315 円 |
2011年12月04日 | 28012 回 | 451 click | 30 action | 1.61 % | 0.11 % | 425 円 |
2011年12月05日 | 17122 回 | 315 click | 17 action | 1.84 % | 0.10 % | 375 円 |
2011年12月06日 | 16212 回 | 275 click | 11 action | 1.70 % | 0.07 % | 285 円 |
2011年12月07日 | 21454 回 | 487 click | 33 action | 2.27 % | 0.15 % | 448 円 |
2011年12月08日 | 41212 回 | 811 click | 64 action | 1.97 % | 0.16 % | 777 円 |
2011年12月09日 | 12151 回 | 301 click | 11 action | 2.48 % | 0.09 % | 285 円 |
2011年12月10日 | 21451 回 | 412 click | 22 action | 1.92 % | 0.10 % | 385 円 |
2011年12月11日 | 17151 回 | 260 click | 14 action | 1.52 % | 0.08 % | 275 円 |
2011年12月12日 | 23712 回 | 612 click | 39 action | 2.58 % | 0.16 % | 555 円 |
2011年12月13日 | 37121 回 | 701 click | 40 action | 1.89 % | 0.11 % | 657 円 |
2011年12月14日 | 41212 回 | 744 click | 74 action | 1.81 % | 0.18 % | 800 円 |
2011年12月15日 | 12141 回 | 160 click | 10 action | 1.32 % | 0.08 % | 125 円 |
2011年12月16日 | 15101 回 | 201 click | 10 action | 1.33 % | 0.07 % | 175 円 |
2011年12月17日 | 24121 回 | 317 click | 38 action | 1.31 % | 0.16 % | 488 円 |
2011年12月18日 | 32128 回 | 815 click | 66 action | 2.54 % | 0.21 % | 715 円 |
2011年12月19日 | 51215 回 | 888 click | 89 action | 1.73 % | 0.17 % | 981 円 |
2011年12月20日 | 36454 回 | 511 click | 41 action | 1.40 % | 0.11 % | 488 円 |
2011年12月21日 | 12155 回 | 304 click | 25 action | 2.50 % | 0.21 % | 285 円 |
合計/平均 | 526927 回 | 9840 click | 700 action | 1.87 % | 0.13 % | 9651円 |