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)的主要内容,如果未能解决你的问题,请参考以下文章