设计动态行转列,拼接SQL语句ed查询

hello-code 2016-07-10 01:49:48
原表有两个字段USERID(用户id)和CHECKTIME(打卡时间),现在想查询得出类似下面的表
我写的一段sql语句,发现只能拿到一个打卡时间,有没有大神帮忙看看怎么改
SET @sql = '';
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(DATE(CHECKTIME) = ''',
DATE(CHECKTIME),
''', CHECKTIME, 0)) AS ''',
DATE(CHECKTIME), ''''
)
) INTO @sql
FROM checkinout
WHERE DATE(CHECKTIME) BETWEEN '2016-06-01' AND '2016-06-05';

SET @sql = CONCAT('Select USERID, ', @sql,
' From checkinout
Group by USERID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2016-07-11
  • 打赏
  • 举报
回复
在你的处理中,只看到弄了一个列,还看不出这个列代表什么意义
zjcxc 2016-07-11
  • 打赏
  • 举报
回复
看起来很累,建议你把汇总处理和行转列分开,中间数据考虑放临时表,这样处理处理就清晰了 -- 基于汇总数据再做交叉表 select userid, concat(max(if(日期='xxx',上班时间,null)), .....) from -- 先得汇总数据(可以考虑弄到临时表) select userid, 日期, 上班时间,上班时间,打卡次数 from xxx )xx group by userid
九月茅桃 2016-07-11
  • 打赏
  • 举报
回复
hello-code 2016-07-10
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
输出查看 @sql 的实际内容是什么。
内容是 MAX(IF(DATE(CHECKTIME) = '2016-06-01', CHECKTIME, 0)) AS '2016-06-01',MAX(IF(DATE(CHECKTIME) = '2016-06-02', CHECKTIME, 0)) AS '2016-06-02',MAX(IF(DATE(CHECKTIME) = '2016-06-03', CHECKTIME, 0)) AS '2016-06-03',MAX(IF(DATE(CHECKTIME) = '2016-06-05', CHECKTIME, 0)) AS '2016-06-05',MAX(IF(DATE(CHECKTIME) = '2016-06-04', CHECKTIME, 0)) AS '2016-06-04'
ACMAIN_CHM 2016-07-10
  • 打赏
  • 举报
回复
输出查看 @sql 的实际内容是什么。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧