MySQL = 按月份分组销售计数,然后将月份显示为名称(Jan、Feb...DEC)而不是数值(1、2、3-12)

Posted

技术标签:

【中文标题】MySQL = 按月份分组销售计数,然后将月份显示为名称(Jan、Feb...DEC)而不是数值(1、2、3-12)【英文标题】:MySQL = Grouping Sales Count by Months, then Displaying months as Names (Jan, Feb...DEC) not Numerical Value (1,2,3-12) 【发布时间】:2020-02-13 10:50:52 【问题描述】:

这似乎是一个相当简单的问题,但是在按月份对销售计数进行分组后,我无法弄清楚如何将月份的数值更改为月份的实际名称。

基本上我想列出每个月的总销售额。目前这是我所拥有的:

SELECT MONTH(SaleDate) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY MONTH(SaleDate);

这非常适合我想做的事情。并给出这个结果:

+---------------------------------+
|     Month      |   TotalSales   |
+---------------------------------+
|       1        |       123      |
|       2        |       142      |
|       3        |       183      |
|       4        |       99       |
|       5        |       127      |
|       6        |       202      |
+---------------------------------+
etc....

但是我希望列表中的月份为一月、二月...等。

我已经尝试了多种方法使用 MONTHNAME()、MONTHNAME(STR_TO_DATE) 和许多其他方法,但将月份分组似乎会导致问题。

我觉得我缺少一个非常简单的解决方案,但在网上找不到任何解决方案。作为参考,销售表中的日期为默认日期(2017-01-01 或 YYYY-MM-DD)。并且sale表有三个属性:SaleID、StoreID和SaleDate。

+---------------------------------+
|     Month      |   TotalSales   |
+---------------------------------+
|    January     |       123      |
|    February    |       142      |
|     March      |       183      |
|     April      |       99       |
|      May       |       127      |
|     June       |       202      |
+---------------------------------+
and so on...

这是我尝试过的方法收到的错误消息:

错误代码:1055。SELECT 列表的表达式 #1 不在 GROUP BY 中 子句并包含非聚合列“UsedCarDealer.Sale.SaleDate” 它在功能上不依赖于 GROUP BY 子句中的列; 这与 sql_mode=only_full_group_by 不兼容

谢谢!

【问题讨论】:

【参考方案1】:

我建议:

SELECT MONTHNAME(SaleDate) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY MONTH(SaleDate), MONTHNAME(SaleDate)
ORDER BY MONTH(SaleDate);

这也将按时间顺序返回值。注意:使用月份时,将年份作为过滤器或在GROUP BY 中包含通常是有意义的。也许更好的查询版本是:

SELECT YEAR(SaleDate) as Year, MONTHNAME(SaleDate) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY YEAR(SaleDate), MONTH(SaleDate)
ORDER BY MIN(SaleDate);

【讨论】:

我假设您的意思是 ORDER YEAR(SaleDate), MONTH(SaleDate) 而不是 ORDER BY MIN(SaleDate) 对于第二个查询看起来有点奇怪? @RaymondNijland 。 . .通过MIN(SaleDate) 进行排序可以完成相同的操作,但输入起来更简单。 当然,但是这种简单的书写风格可能会导致 mysql 在排序步骤上做额外的工作,ORDER YEAR(SaleDate), MONTH(SaleDate) 可以简单地重用加载的页面,这就是我所说的“奇怪” @RaymondNijland 。 . .有趣的一点。 group by 的隐式排序已被弃用很长时间。那就是为更好的聚合算法腾出空间。但是,您有一个很好的观点,即使用相同键的显式 order by 可能有意义,因为优化器可以选择正确的算法。 “这是为更好的聚合算法腾出空间。但是,您有一个很好的观点,即使用相同键的显式排序可能有意义,因为优化器可以选择正确的算法。 " 那么我猜,当 MySQL 的 8 个 explain format=json 输出为 ORDER BY MIN(SaleDate) 接缝时,MySQL 开发人员需要进行优化,以降低预期成本,这与我的想法相反【参考方案2】:

试试这个:

SELECT MONTHNAME(STR_TO_DATE(MONTH(SaleDate), '%m')) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY MONTH(SaleDate);

【讨论】:

以上是关于MySQL = 按月份分组销售计数,然后将月份显示为名称(Jan、Feb...DEC)而不是数值(1、2、3-12)的主要内容,如果未能解决你的问题,请参考以下文章

如何按月份或年份计数和分组,月份为零

Laravel 仅按日期分组并获取计数

选择按month.year分组的两个日期之间的用户计数,并且对于count = 0的月份包括零

mysql |按时间分组计数记录

SQL 按客户分组的最近 15 个月的销售额

按每年唯一的月份分组,而不仅仅是月份[重复]