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

【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

 

相关文章:

  • 基于php的在线租房管理系统
  • 分享课程:VUE数据可视化教程
  • kubernetes基础配置(入门操作)
  • Android平台Unity3D下如何同时播放多路RTMP|RTSP流?
  • 项目集成SpringSecurity框架
  • vue 项目中的配置文件(.env)的用法
  • 北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级
  • java实现Servlet的三种方式
  • 简站wordpress主题产品多图ACF插件设置方法
  • 搭建高效知识库:教培机构数字教学的关键一步
  • 【JS基础 day02 类型转换、语句】
  • 【html】基础(二)
  • 深入剖析 Android Lifecycle:构建高效稳定的应用
  • 视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法
  • Activiti7《第九式:破气式》——流畅驱动工作流进程。面试题大全
  • C++入门教程(10):for 语句
  • canvas 五子棋游戏
  • Git的一些常用操作
  • IP路由与转发
  • Java超时控制的实现
  • Nacos系列:Nacos的Java SDK使用
  • nodejs实现webservice问题总结
  • PAT A1092
  • sessionStorage和localStorage
  • 百度小程序遇到的问题
  • 高程读书笔记 第六章 面向对象程序设计
  • 计算机常识 - 收藏集 - 掘金
  • 实现简单的正则表达式引擎
  • 协程
  • 用Canvas画一棵二叉树
  • 湖北分布式智能数据采集方法有哪些?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #APPINVENTOR学习记录
  • #pragma pack(1)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (152)时序收敛--->(02)时序收敛二
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (论文阅读11/100)Fast R-CNN
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net 7 上传文件踩坑
  • .NET BackgroundWorker
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net dataexcel 脚本公式 函数源码
  • .net wcf memory gates checking failed
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET实现之(自动更新)