0

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

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

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 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“UsedCarDealer.Sale.SaleDate”;这与 sql_mode=only_full_group_by 不兼容

谢谢!

4

2 回答 2

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);
于 2019-10-16T15:42:55.363 回答
0

试试这个:

SELECT MONTHNAME(STR_TO_DATE(MONTH(SaleDate), '%m')) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY MONTH(SaleDate);
于 2019-10-16T15:41:06.320 回答