LeetCodeSQL专项计划:1484. 按日期分组销售产品

60 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 23 天,点击查看活动详情

难度评分

难度评分:⭐⭐

题目

1484. 按日期分组销售产品

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 分隔符)

思路

  1. 首先题目要求是按照日期进行分组,找该日期分组下的销售物品数量和名称
SELECT * FROM activities GROUP BY sell_date;

image.png

  1. 我们看到按照日期分组的话理想中的情况应该是这样的,但是由于是分组的特性,分组只能显示一个内容,所以*中的product是取分组中的第一个出现的内容,即上图效果:

image.png

  1. 我们用COUNT函数验证,其实product是存在的
SELECT sell_date,COUNT(*) AS num_sold FROM activities GROUP BY sell_date;

我们发现一个问题,由于是按照*统计行数,所以将重复数据统计了出来,这并不是我们想要的答案,所以要按照名称去重。

image.png

SELECT sell_date,COUNT(DISTINCT product) AS num_sold FROM activities GROUP BY sell_date;
  1. 这样看,我们就差最后一列没实现了。现在就要用到GROUP_CONCAT函数了,语法参照上面,其实就是将分组后的每个produt进行组合即可。