开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情
难度评分
难度评分:⭐⭐
题目
Create Table & Insert
-- ----------------------------
-- Table structure for activities
-- ----------------------------
DROP TABLE IF EXISTS `activities`;
CREATE TABLE `activities` (
`sell_date` date NULL DEFAULT NULL,
`product` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of activities
-- ----------------------------
INSERT INTO `activities` VALUES ('2020-05-30', 'Headphone');
INSERT INTO `activities` VALUES ('2020-06-01', 'Pencil');
INSERT INTO `activities` VALUES ('2020-06-02', 'Mask');
INSERT INTO `activities` VALUES ('2020-05-30', 'Basketball');
INSERT INTO `activities` VALUES ('2020-06-01', 'Bible');
INSERT INTO `activities` VALUES ('2020-06-02', 'Mask');
INSERT INTO `activities` VALUES ('2020-05-30', 'T-Shirt');
SQL
SELECT sell_date, COUNT(DISTINCT product) AS num_sold,GROUP_CONCAT(DISTINCT product SEPARATOR ',') AS products
FROM Activities GROUP BY sell_date;
备注
这题主要涉及GROUP_CONCAT
语句。
作用:将某一列的值按照什么分割符号进行组合。就像V这个列:
V |
---|
a |
b |
b |
c |
通过下面的SQL语句
GROUP_CONCAT(product SEPARATOR ',') AS res
会变成:
res |
---|
a,b,b,c |
GROUP_CONCAT语法
GROUP_CONCAT([DISTICT] 列名 [ORDER BY] SEPARATOR 分隔符)
思路
- 首先题目要求是按照日期进行分组,找该日期分组下的销售物品数量和名称
SELECT * FROM activities GROUP BY sell_date;
- 我们看到按照日期分组的话理想中的情况应该是这样的,但是由于是分组的特性,分组只能显示一个内容,所以
*
中的product
是取分组中的第一个出现的内容,即上图效果:
- 我们用
COUNT
函数验证,其实product
是存在的
SELECT sell_date,COUNT(*) AS num_sold FROM activities GROUP BY sell_date;
我们发现一个问题,由于是按照*
统计行数,所以将重复数据统计了出来,这并不是我们想要的答案,所以要按照名称去重。
SELECT sell_date,COUNT(DISTINCT product) AS num_sold FROM activities GROUP BY sell_date;
- 这样看,我们就差最后一列没实现了。现在就要用到
GROUP_CONCAT
函数了,语法参照上面,其实就是将分组后的每个produt
进行组合即可。