当前位置: 首页 > article >正文

【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

 


http://www.kler.cn/news/319891.html

相关文章:

  • 前端开发——(1)使用vercel进行网页开发
  • vue路由的基本使用
  • Linux-L14-Linux中把用户加入到管理者root中
  • 鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例
  • 无人机探测:光电侦测技术详解
  • Gstreamer中,使用mp4或者flv作为视频源去推流RTP等视频流时,需要先解码在编码才能正常
  • 使用Postman工具接口测试
  • Redis常见知识点
  • arm-硬件
  • 源码编译OpenJDK 12
  • JS二叉树的深度优先、广度优先实现代码
  • Java数据库连接jdbc
  • MATLAB基础应用精讲-【数模应用】OR值
  • 牛客周赛 Round 61 (C++实现)
  • 【算法中的最优解和较优解问题】
  • 开源标注工具
  • 【Java】注解与单元测试的使用【主线学习笔记】
  • JS手写Promise以及promise.all方法
  • QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]
  • Go Mail设置指南:如何提升发送邮件效率?
  • 【Linux 从基础到进阶】Hadoop 大数据平台搭建与优化
  • ARM/Linux嵌入式面经(三九):中科驭数
  • 解决多尺度网络中上采样尺寸不一致问题
  • 低代码中实现数据映射的必要性与方案
  • 18 vue3之定义自定义指令Directive
  • 10.Lab Nine —— file system-上
  • 跳跃列表(Skip List)详解
  • JS显示数字时钟的格式时间
  • Vue.js 与 Flask 或 Django 后端配合
  • ArrayList源码实现(一)