以日期为列的mysql动态交叉表

以日期为列的mysql动态交叉表,mysql,database,date,pivot,crosstab,Mysql,Database,Date,Pivot,Crosstab,这是我的问题,假设我有一个数据库表,看起来像这样: tbl:传入 ID | Type | cdate 1 | Type1 | 2014-07-01 6:00:00 1 | Type2 | 2014-07-02 6:00:00 1 | Type1 | 2014-07-03 6:00:00 1 | Type3 | 2014-07-04 6:00:00 1 | Type2 | 2014-07-04 6:00:00 我需要一个将日期显示为列的查询: Type | 7-1 | 7-2

这是我的问题,假设我有一个数据库表,看起来像这样:

tbl:传入

ID | Type  | cdate
 1 | Type1 | 2014-07-01 6:00:00
 1 | Type2 | 2014-07-02 6:00:00
 1 | Type1 | 2014-07-03 6:00:00
 1 | Type3 | 2014-07-04 6:00:00
 1 | Type2 | 2014-07-04 6:00:00
我需要一个将日期显示为列的查询:

Type  |  7-1  |  7-2  |  7-3  |  7-4  
Type1 |  1    |  0    |   1   |  0
Type2 |  0    |  1    |   0   |  1
Type3 |  0    |  0    |   0   |  1
我的SQL代码是:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'count(case when date_format(cdate, '%m-%d') = ''',
      date_format(cdate, '%m-%d'),
      ''' then 1 end) AS ',
      replace(cdate, ' ', '')
    )
  ) INTO @sql
from incoming WHERE cdate BETWEEN '2014-07-01 5:00:00' AND '2014-07-04 5:00:00';

SET @sql = CONCAT('SELECT type, ', @sql, ' from incoming group by type');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我在运行脚本时收到一个sql语法错误。有人能帮我找出什么是坏的吗?

您需要对表达式中的单引号进行转义。 另外,为您的列创建一个更简单的别名,并将其括在背景标记中以防万一

设置@sql=NULL; 选择 组_CONCATDISTINCT 海螺 “countcase when date\u formatcdate,\'%m-%d\'=\,-此处带转义引号 日期格式化日期,'%m-%d',-我更喜欢使用 “\”则1结束为“,-\”而不是' “`',date_formatcdate”“%Y%m%d”“,“`”-为创建一个更简单的别名 -列,别忘了 -将别名括在 -背虱` 进入@sql 从传入; 设置@sql=CONCAT'SELECT type',@sql'from incoming group by type'; 选择@sql; 从@sql准备stmt; 执行stmt; 解除分配准备stmt;
检查

谢谢这工作做得很好。“我一直在想它为什么好几天都不起作用了。”Mike2414很乐意帮忙。检查@sql是否正确的一个简单方法是简单地显示它的值:选择@sql。此外,最好始终将列别名括在backticks@Barranka,你能帮我回答同样的问题吗