【SQL】产品分组销售

目录

语法

需求

示例

分析

代码


语法

GROUP_CONCAT(DISTINCT expression1 ORDER BY expression2 SEPARATOR sep)

GROUP_CONCAT 是 SQL 中的一个聚合函数,主要用于将分组后的多个行的值连接成一个字符串。这个函数在 MySQL 和一些其他数据库管理系统中得到支持,是处理分组数据时非常有用的工具。 

  • DISTINCT:可选参数,用于去除结果中的重复值。
  • expression:要连接的表达式或列名。
  • ORDER BY:可选参数,用于指定连接结果的排序顺序。可以是数字索引(基于结果集中的位置),也可以是列名或表达式。
  • SEPARATOR:可选参数,用于指定连接结果中的分隔符,默认为逗号(,)。

当处理大量数据时,GROUP_CONCAT 可能会受到 group_concat_max_len 的限制,导致结果被截断。此时,可以通过设置 group_concat_max_len 的值来增加限制,但请注意这可能会影响数据库的性能。在多用户并发环境下,尤其是大数据量时,GROUP_CONCAT 的性能可能会受到影响,因为它需要在内存中进行数据处理。

SELECT column1, column2, ...  FROM table_name  ORDER BY column1 ASC, column2 ASC, ...;

在 SQL 查询中,ORDER BY 子句用于指定一个或多个列,这些列决定了结果集中的行如何排序。当在 ORDER BY 子句后加上 ASC 关键字时,明确指定了排序的方向为升序。如果不指定 ASC 或 DESC(降序),则默认排序方向是升序。 

  • column1, column2, ...:指定需要排序的列名。
  • table_name:指定要从中检索数据的表名。
  • ASC:指定排序的方向为升序(从最小值到最大值)。

如果在 ORDER BY 子句中指定了多个列,则这些列将按照在 ORDER BY 子句中列出的顺序进行排序。首先按照第一个列排序,然后在该列的值相同的情况下,按照第二个列排序,依此类推。

在某些情况下,如果没有明确的排序需求,可以省略 ORDER BY 子句,但这可能会导致每次查询时返回的行顺序不同,因为数据库管理系统DBMS不保证未指定排序的查询结果的顺序。

需求

表 Activities

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| sell_date   | date    |
| product     | varchar |
+-------------+---------+
该表没有主键(具有唯一值的列)。它可能包含重复项。
此表的每一行都包含产品名称和在市场上销售的日期。

编写解决方案找出每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
返回按 sell_date 排序的结果表。
结果表结果格式如下例所示。

示例

输入:
Activities表:
+------------+-------------+
| sell_date  | product     |
+------------+-------------+
| 2020-05-30 | Headphone   |
| 2020-06-01 | Pencil      |
| 2020-06-02 | Mask        |
| 2020-05-30 | Basketball  |
| 2020-06-01 | Bible       |
| 2020-06-02 | Mask        |
| 2020-05-30 | T-Shirt     |
+------------+-------------+
输出:
+------------+----------+------------------------------+
| sell_date  | num_sold | products                     |
+------------+----------+------------------------------+
| 2020-05-30 | 3        | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2        | Bible,Pencil                 |
| 2020-06-02 | 1        | Mask                         |
+------------+----------+------------------------------+
解释:
对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。
对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。
对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。

分析

编写解决方案找出每个日期、销售的不同产品的数量及其名称

需要找出每天销售不同产品的数量以及产品的名称

首先按照销售日期分组,group by sell_date

不同产品的数量

计算数量考虑count()函数,针对不同产品的数量,依据示例实际是指销售产品的类别数

通过distinct()筛选不同产品,然后计数即为产品类别数,count(distinct(product)) as num_sold

列出产品的名称,每个日期的销售产品名称应按词典序排列

注意实际示例,这里的列出产品名称实际指把所有产品名称整理合并,对每个组中所有唯一的名称进行排序和连接,以获得 products 列。需要使用函数 GROUP_CONCAT() 将多行中的多个值组合成一个字符串,并用逗号分隔。

group_concat(distinct product order by product separator ',') as products

代码

select 
    sell_date,
    count(distinct(product)) as num_sold,
    group_concat(distinct product order by product separator ',') as products
from Activities
group by sell_date
order by sell_date asc

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F_D_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值