2017-08-02 79 views
1

我想不仅要统计一组数据的主要分组,还要总计下一个分组级别。在我的情况下,ROLLUP总计一个月(行)的值,但我也想总计销售代表(列)的值。MySQL总计行数和列数

http://sqlfiddle.com/#!9/60608/1

我最大的努力迄今:

CREATE TABLE IF NOT EXISTS SALES (
Month INT(3), 
Rep CHAR(60), 
Val DECIMAL (20 , 6) 
); 

INSERT INTO SALES (Month, Rep, Val) VALUES 
('9','Rep1',10), 
('9','Rep1',20), 
('9','Rep2',20), 
('9','Rep2',30), 
('9','Rep2',40), 
('10','Rep1',50), 
('10','Rep1',60), 
('10','Rep2',70), 
('11','Rep2',80); 

SELECT Month, IFNULL(Rep, 'Total'), SUM(Val) As TotalValue 
FROM SALES 
GROUP BY FIELD(Month, 
    '9', 
    '10', 
    '11') ASC, Rep WITH ROLLUP 

产生如下

9 Rep1 30 
9 Rep2 90 
9 Total 120 
10 Rep1 110 
10 Rep2 70 
10 Total 180 
11 Rep2 80 
11 Total 80 
11 Total 380 

理想我想它显示

9 Rep1 30 
9 Rep2 90 
9 Total 120 
10 Rep1 110 
10 Rep2 70 
10 Total 180 
11 Rep2 80 
11 Total 80 
11 Total 380 
0 Rep1 140 
0 Rep2 240 
+0

认真考虑存储DATE或整月 – Strawberry

+0

会改变月份日期/整数月结果的解决方案? – Walkertron

+0

谁知道;-)。它可能。 – Strawberry

回答

0

例如(虽然实际上我可能会处理在应用程序代码的汇总数据):

SELECT * FROM (SELECT month,rep,SUM(val) val FROM sales GROUP BY month,rep WITH ROLLUP) x 
UNION 
SELECT 0,rep, SUM(val) FROM sales GROUP BY rep; 
+-------+------+------------+ 
| month | rep | val  | 
+-------+------+------------+ 
|  9 | Rep1 | 30.000000 | 
|  9 | Rep2 | 90.000000 | 
|  9 | NULL | 120.000000 | 
| 10 | Rep1 | 110.000000 | 
| 10 | Rep2 | 70.000000 | 
| 10 | NULL | 180.000000 | 
| 11 | Rep2 | 80.000000 | 
| 11 | NULL | 80.000000 | 
| NULL | NULL | 380.000000 | 
|  0 | Rep1 | 140.000000 | 
|  0 | Rep2 | 240.000000 | 
+-------+------+------------+ 
+0

完美无缺 – Walkertron