如下的用户访问数据
userId visitDate visitCount
u01 2017-01-21 5 1
u01 2017-01-23 6 2
u02 2017-01-23 6 3
u03 2017-01-22 8 4
u04 2017-01-20 3 5
u02 2017-02-21 8 6
u01 2017-02-22 4 7
u01 2017-02-23 5 8
要求使用SQL统计出每个用户的累积访问次数,如下表所示:
用户id 月份 小计 累积
u01 2017-01 11 11
u02 2017-01 6 6
u03 2017-01 8 8
u04 2017-01 3 3
u02 2017-02 8 14
u01 2017-02 9 20
做sql题首先要理清思路
这个题目的要查的是 用户id 月份 小计 累积
(1.用户id好说可以可以直接拿到
(2.月份 给的数据是年月日我们要自己转成年月类型的
(3.小计 就是按用户id和月份进行分类后的访问次数的和
(4.累积 是按月份 将前面的小计求和(麻烦)
准备数据:
CREATE TABLE `count_user_visit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` char(5) COLLATE utf8_bin NOT NULL,
`visit_date` date DEFAULT NULL,
`visit_count` int(9) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (1, 'u01', '2017-01-21', 5);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (2, 'u01', '2017-01-23', 6);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (3, 'u02', '2017-01-23', 6);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (4, 'u03', '2017-01-22', 8);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (5, 'u04', '2017-01-20', 3);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (6, 'u02', '2017-02-21', 8);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (7, 'u01', '2017-02-22', 4);
INSERT INTO `lls_test`.`count_user_visit`(`id`, `user_id`, `visit_date`, `visit_count`) VALUES (8, 'u01', '2017-02-23', 5);
查出小计:
SELECT
user_id,
visit_count,
Date_format( visit_date, '%Y-%m' ) yue
FROM
count_user_visit;
SELECT
a.user_id 用户 id,
a.yue 月份,
sum( visit_count ) 小计
FROM
( SELECT user_id, visit_count, Date_format( visit_date, '%Y-%m' ) yue FROM count_user_visit ) a
GROUP BY
a.user_id,
a.yue;
查出累积:
SELECT
a.user_id 用户id,
a.yue 月份,
sum( visit_count ) 小计,
(
SELECT
SUM( b.小计 )
FROM
(
SELECT
a.id 用户id,
a.yue 月份,
SUM( vc ) 小计
FROM
( SELECT user_id id, visit_count vc, DATE_FORMAT( visit_date, '%Y-%m' ) yue FROM count_user_visit ) a
GROUP BY
a.id,
a.yue
) b
WHERE
b.月份<= a.yue
AND b.用户id = a.user_id
) 累积
FROM
( SELECT user_id, visit_count, Date_format( visit_date, '%Y-%m' ) yue FROM count_user_visit ) a
GROUP BY
a.user_id,
a.yue;