Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL=按月份对销售计数进行分组,然后将月份显示为名称(一月、二月、十二月),而不是数字值(1,2,3-12)_Mysql_Sql_Formatting_Grouping_Str To Date - Fatal编程技术网

MySQL=按月份对销售计数进行分组,然后将月份显示为名称(一月、二月、十二月),而不是数字值(1,2,3-12)

MySQL=按月份对销售计数进行分组,然后将月份显示为名称(一月、二月、十二月),而不是数字值(1,2,3-12),mysql,sql,formatting,grouping,str-to-date,Mysql,Sql,Formatting,Grouping,Str To Date,这似乎是一个相当简单的问题,但我不知道在销售计数按月份分组后如何将一个月的数值更改为月份的实际名称 基本上我想列出每个月的总销售额。目前我拥有的是: SELECT MONTH(SaleDate) as "Month", Count(*) as "TotalSales" FROM Sale GROUP BY MONTH(SaleDate); 这对我想做的事情非常有效。并给出了以下结果: +---------------------------------+ | Month |

这似乎是一个相当简单的问题,但我不知道在销售计数按月份分组后如何将一个月的数值更改为月份的实际名称

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

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、MONTHNAMESTR_TO_DATE和许多其他方法,但将月份分组似乎会导致问题

我觉得我错过了一个非常简单的解决方案,但无法在网上找到任何解决方案。作为参考,Sale表中的日期默认为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。选择列表的表达式1不在GROUP BY中 子句,并包含非聚合列“UsedCarder.Sale.SaleDate” 功能上不依赖于GROUP BY子句中的列; 这与sql\u mode=only\u full\u group\u by不兼容

谢谢

试试这个:

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

SELECT MONTHNAME(SaleDate) as "Month", Count(*) as "TotalSales"
FROM Sale
GROUP BY MONTH(SaleDate), MONTHNAME(SaleDate)
ORDER BY MONTH(SaleDate);
这也将按时间顺序返回值。注意:当使用月份时,通常有必要将年份作为过滤器或按分组。或许更好的查询版本是:

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

我猜你指的是订单年销售日期,而不是订单月销售日期,因为第二个查询中按分钟销售日期订购看起来有点奇怪?@RaymondNijland。按MINSaleDate排序也可以做同样的事情,但更容易键入。当然,这种简单的写入方式可能会导致MySQL在排序步骤上做额外的工作,ORDER YEARSaleDate、MONTHSaleDate可以简单地重用加载的页面,这就是我的意思odd@RaymondNijland . . . 有趣的一点。使用group by的隐式排序已被弃用很长时间。这是为了为更好的聚合算法腾出空间。但是,您有一个很好的观点,即使用相同的键进行显式排序可能是有意义的,因为优化器可以选择正确的算法,也就是为更好的聚合算法腾出空间。但是,您有一个很好的观点,即使用相同的键进行显式排序可能是有意义的,因为优化器可以选择正确的算法。好吧,我认为MySQL开发人员需要进行优化,当看到这个MySQL的8个输出按MINSaleDate seams排序时,预期成本会降低,这与我的想法相反