MySQL group_concat()按月订购

时间:2015-03-11 05:27:06

标签: mysql group-concat

我有一个名为MonthYear的日期列的mysql表,其中包含2013年3月到2014年1月的yyyy-mm-dd格式的日期。我尝试group_concat()该列,

select
GROUP_CONCAT(DISTINCT 
           CONCAT(' ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, ''%b %y'')=''',
                   DATE_FORMAT(ms.MonthYear, '%b %y'),
                   ''' THEN Count ELSE 0 END)) AS ''', 
                   DATE_FORMAT(ms.MonthYear, '%b %y'), '''' 
                 )
             )
INTO @sql from mysamp ms order by ms.MonthYear

但结论是,

ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Sep 13' THEN Count ELSE 0 END)) AS 'Sep 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Oct 13' THEN Count ELSE 0 END)) AS 'Oct 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Jun 13' THEN Count ELSE 0 END)) AS 'Jun 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Jul 13' THEN Count ELSE 0 END)) AS 'Jul 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Dec 13' THEN Count ELSE 0 END)) AS 'Dec 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='May 13' THEN Count ELSE 0 END)) AS 'May 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Aug 13' THEN Count ELSE 0 END)) AS 'Aug 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Nov 13' THEN Count ELSE 0 END)) AS 'Nov 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Jan 14' THEN Count ELSE 0 END)) AS 'Jan 14', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Apr 13' THEN Count ELSE 0 END)) AS 'Apr 13', 
ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, '%b %y')='Mar 13' THEN Count ELSE 0 END)) AS 'Mar 13'

为什么结论的结果会出现无序格式?

1 个答案:

答案 0 :(得分:1)

在您的查询中,您没有GROUP BY子句,这意味着您的组实际上变为所有行,并且您获得了具有分组输出的单个结果行。

当前语句中的ORDER BY正在应用于结果集,但是结果中只有一行,因此顺序实际上并没有在那里做任何有用的事情。

要将输入的行排序到GROUP_CONCAT函数中,您可以在GROUP_CONCAT函数本身的参数中指定ORDER,与您当前指定的DISTINCT非常相似。

请参阅此处的文档: http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_group-concat

这应该做你需要的:

select
GROUP_CONCAT(DISTINCT
           CONCAT(' ROUND(SUM(CASE WHEN DATE_FORMAT(MonthYear, ''%b %y'')=''',
                   DATE_FORMAT(ms.MonthYear, '%b %y'),
                   ''' THEN Count ELSE 0 END)) AS ''', 
                   DATE_FORMAT(ms.MonthYear, '%b %y'), '''' 
                 )  
              ORDER BY ms.MonthYear)
INTO @sql from mysamp ms