裏MySQL ユーザー変数を使って合計と平均も同時に計算する。

合計も同時に出したいだけであれば、GROUP BYと共にWITH ROLLUPを使うことでできます
http://dev.mysql.com/doc/refman/4.1/ja/group-by-modifiers.html


しかし、同時にカラムによって合計/平均を出したいなど複雑な条件の場合はできません。その場合ユーザー変数を使うことで1クエリで処理することができます。

サンプルとして以下のようなアフィリエイトのレポート画面用のテーブルを使って説明します。

CREATE TABLE `report` (
  `report_id`   BIGINT       NOT NULL AUTO_INCREMENT,
  `report_date` DATE         NOT NULL ,
  `imp`         INT          NOT NULL ,
  `click`       INT          NOT NULL ,
  `action`      INT          NOT NULL ,
  `revenue`     INT          NOT NULL ,
PRIMARY KEY (  `report_id`  ),
UNIQUE      (  `report_date`)
) ENGINE = INNODB;
INSERT INTO `report` (
`report_date` ,
`imp` ,
`click` ,
`action` ,
`revenue`
)
VALUES 
('2011/12/01',  '12125',  '315',  '15', '200'),
('2011/12/02',  '32132',  '615',  '40', '612'),
('2011/12/03',  '22545',  '345',  '11', '315'),
('2011/12/04',  '28012',  '451',  '30', '425'),
('2011/12/05',  '17122',  '315',  '17', '375'),
('2011/12/06',  '16212',  '275',  '11', '285'),
('2011/12/07',  '21454',  '487',  '33', '448'),
('2011/12/08',  '41212',  '811',  '64', '777'),
('2011/12/09',  '12151',  '301',  '11', '285'),
('2011/12/10',  '21451',  '412',  '22', '385'),
('2011/12/11',  '17151',  '260',  '14', '275'),
('2011/12/12',  '23712',  '612',  '39', '555'),
('2011/12/13',  '37121',  '701',  '40', '657'),
('2011/12/14',  '41212',  '744',  '74', '800'),
('2011/12/15',  '12141',  '160',  '10', '125'),
('2011/12/16',  '15101',  '201',  '10', '175'),
('2011/12/17',  '24121',  '317',  '38', '488'),
('2011/12/18',  '32128',  '815',  '66', '715'),
('2011/12/19',  '51215',  '888',  '89', '981'),
('2011/12/20',  '36454',  '511',  '41', '488'),
('2011/12/21',  '12155',  '304',  '25', '285')
report_id report_date imp click action revenue
1 2011-12-01 12125 315 15 200
2 2011-12-02 32132 615 40 612
3 2011-12-03 22545 345 11 315
4 2011-12-04 28012 451 30 425
5 2011-12-05 17122 315 17 375
6 2011-12-06 16212 275 11 285
7 2011-12-07 21454 487 33 448
8 2011-12-08 41212 811 64 777
9 2011-12-09 12151 301 11 285
10 2011-12-10 21451 412 22 385
11 2011-12-11 17151 260 14 275
12 2011-12-12 23712 612 39 555
13 2011-12-13 37121 701 40 657
14 2011-12-14 41212 744 74 800
15 2011-12-15 12141 160 10 125
16 2011-12-16 15101 201 10 175
17 2011-12-17 24121 317 38 488
18 2011-12-18 32128 815 66 715
19 2011-12-19 51215 888 89 981
20 2011-12-20 36454 511 41 488
21 2011-12-21 12155 304 25 285


WITH ROLLUPで出す場合、今回のサンプルでは無駄に合計したい対象のカラムにsum関数と元から一意なreport_dateにGROUOP BYをかけてあげる必要があります。

SELECT
  report_id,
  report_date,
  sum(imp)     imp   ,
  sum(click)   click ,
  sum(action)  action,
  sum(revenue) revenue
FROM
  report 
GROUP BY
 report_date 
WITH ROLLUP;
report_id report_date imp click action revenue
1 2011-12-01 12125 315 15 200
2 2011-12-02 32132 615 40 612
3 2011-12-03 22545 345 11 315
4 2011-12-04 28012 451 30 425
5 2011-12-05 17122 315 17 375
6 2011-12-06 16212 275 11 285
7 2011-12-07 21454 487 33 448
8 2011-12-08 41212 811 64 777
9 2011-12-09 12151 301 11 285
10 2011-12-10 21451 412 22 385
11 2011-12-11 17151 260 14 275
12 2011-12-12 23712 612 39 555
13 2011-12-13 37121 701 40 657
14 2011-12-14 41212 744 74 800
15 2011-12-15 12141 160 10 125
16 2011-12-16 15101 201 10 175
17 2011-12-17 24121 317 38 488
18 2011-12-18 32128 815 66 715
19 2011-12-19 51215 888 89 981
20 2011-12-20 36454 511 41 488
21 2011-12-21 12155 304 25 285
21 NULL 526927 9840 700 9651