以日期为列的mysql动态交叉表
这是我的问题,假设我有一个数据库表,看起来像这样: tbl:传入以日期为列的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
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,你能帮我回答同样的问题吗