DROP TABLE IF EXISTS `tt2`;
CREATE TABLE `tt2` (
`sno` int(11) DEFAULT NULL,
`sname` varchar(255) DEFAULT NULL,
`sage` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tt2
-- ----------------------------
INSERT INTO `tt2` VALUES ('1001', '张三1', '19');
INSERT INTO `tt2` VALUES ('1002', '张三2', '21');
INSERT INTO `tt2` VALUES ('1003', '张三3', '21');
INSERT INTO `tt2` VALUES ('1004', '张三4', '21');
INSERT INTO `tt2` VALUES ('1005', '张三5', '18');
INSERT INTO `tt2` VALUES ('1006', '张三6', '23');
INSERT INTO `tt2` VALUES ('1007', '张三7', '22');
INSERT INTO `tt2` VALUES ('1008', '张三8', '22');
INSERT INTO `tt2` VALUES ('1009', '张三9', '23');
INSERT INTO `tt2` VALUES ('1010', '张三10', '21');
上边是表结构
统计10-19岁 20-29岁 分段人数 并求总和
SELECT
FLOOR(sage / 10),
COUNT(FLOOR(sage / 10)) AS area_count
FROM
tt2
GROUP BY
FLOOR(sage / 10) WITH ROLLUP
执行结果如下:
有人有疑惑 为什么执行下边这条SQL语句
SELECT
FLOOR(sage / 10)*10 ,
COUNT(FLOOR(sage / 10)) AS area_count
FROM
tt2
GROUP BY
FLOOR(sage / 10) WITH ROLLUP
结果是
有一些人可能会感觉为什么第一列是10 20 20 不是 10 10 null 呢
可以看一下 这里已经*10了 也就是说他不是你的分组字段了 已经成了一个其他字段了
比如你执行这个
SELECT
FLOOR(sage / 10),
FLOOR(sage / 10)*10 ,
COUNT(FLOOR(sage / 10)) AS area_count
FROM
tt2
GROUP BY
FLOOR(sage / 10) WITH ROLLUP
这里的第一列最后一行记录就是null 这才是你的分组的那条字段信息
优化:
如果你想要实现*10 还要保留null 可以在外边嵌套一层查询
SELECT
fd * 10,
area_count
FROM
(
SELECT
FLOOR(sage / 10) fd,
COUNT(FLOOR(sage / 10)) AS area_count
FROM
tt2
GROUP BY
FLOOR(sage / 10) WITH ROLLUP
) a
结果就是这个:
建议这样使用:
SELECT
case fd
when 1 then '10-19岁'
when 2 then '20-29岁'
else '总数' end 分段 ,
area_count 数量
FROM
(
SELECT
FLOOR(sage / 10) fd,
COUNT(FLOOR(sage / 10)) AS area_count
FROM
tt2
GROUP BY
FLOOR(sage / 10) WITH ROLLUP
) a
结果: