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
我有一个 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