WITH ROLLUP

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

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值