MySQL group_concat() 按月排序

MySQL group_concat() month wise ordering

我有一个 mysql table,日期列名为 MonthYear,其中包含 yyyy-mm-dd 格式的从 2013 年 3 月到 2014 年 1 月的日期。我试图 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'

为什么拼接后的结果是乱码?

在您的查询中,您没有 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