我有一个名为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'
为什么结论的结果会出现无序格式?
答案 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