mysql之GROUP_CONCAT

在MySQL中,可以使用GROUP_CONCAT函数结合聚合函数COUNT来实现按日期分组统计销售产品的数量和名称。GROUP_CONCAT允许我们将相同日期下不同产品的名称拼接在一起,同时COUNT函数计算每个日期的唯一产品数。查询结果按日期排序并展示每个日期的产品数量和名称列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1484. 按日期分组销售产品

表 Activities:
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| sell_date | date |
| product | varchar |
±------------±--------+
此表没有主键,它可能包含重复项。
此表的每一行都包含产品名称和在市场上销售的日期。
编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
返回按 sell_date 排序的结果表。
查询结果格式如下例所示。
±-----------±---------±-----------------------------+
| sell_date | num_sold | products |
±-----------±---------±-----------------------------+
| 2020-05-30 | 3 | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2 | Bible,Pencil |
| 2020-06-02 | 1 | Mask |
±-----------±---------±-----------------------------+

问题分析

难点:需要将查询出来的products使用’,'进行拼接
开始计划使用CONCAT_WS(symbol, str2, str3……)进行拼接,但是该函数需要使用已知的字段进行拼接,而本题使用的是查询的多行结果拼接

select 
    sell_date, 
    COUNT(distinct product ) as num_sold,
    CONCAT_WS(',' , select product from Activities as b where b.sell_date = sell_date) as products
from 
    Activities  as a
group by 
    sell_date
order by 
    sell_date;

报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘select product from Activities as b where b.sell_date = sell_date) as products
f’ at line 5

搜寻一番发现了GROUP_CONCAT函数

GROUP_CONCAT([DISTINCT] column1 [ORDER BY column2 ASC\DESC] [SEPARATOR seq]);
  • DISTINCT 是可选,去重
  • column1 需要拼接的列
  • [ORDER BY column2 ASC\DESC] 可选 是否需要排序
  • [SEPARATOR seq] 拼接符 可选 如果没有指定SEPARATOR的话,也就是说没有写,那么就会默认以 ','分隔

代码:

# Write your MySQL query statement below
select 
    sell_date, 
    COUNT(distinct product ) as num_sold,
    GROUP_CONCAT(distinct product order by product SEPARATOR ',') products
from 
    Activities  as a
group by 
    sell_date
order by 
    sell_date;
group_concatMySQL中的一个聚合函数,用于将多行数据按照指定的分隔符连接成一行返回。最简单的用法是将某个字段的值连接在一起,可以通过在group_concat函数中指定要连接的字段来实现。例如,使用group_concat(price)可以将表中price字段的值按照逗号分隔连接成一行返回。 如果想要对连接后的结果进行排序,可以使用Order BY子句,并在group_concat函数中指定排序字段以及排序顺序。例如,使用group_concat(price ORDER BY price DESC)可以将连接后的结果按照price字段降序排列。 另外,还可以使用DISTINCT关键字来去重,使用Separator关键字来指定连接的分隔符。例如,使用group_concat(DISTINCT price SEPARATOR ';')可以将连接后的结果按照分号分隔,并去除重复的值。 总结来说,group_concat函数可以根据指定的字段和条件将多行数据连接成一行返回,并可以通过排序、去重和指定分隔符来满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mysqlgroup_concat函数详解](https://blog.youkuaiyun.com/bobozai86/article/details/119858193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值