Mysql过程在行到列转换后只显示10列 [英] Mysql procedure showing only 10 columns after rows to column conversion

查看:86
本文介绍了Mysql过程在行到列转换后只显示10列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

For example:

Name  | 1stjan   | 2ndjan   | 3rdjan   | 4thjan
jenny | present  | absent   | present  | present
clark | absent   | present  | present  | present

Original tables - emp_details 

id | emp_id |   Name 
1  | 51     |  jenny
2  | 52     |  clark
Original tables - emp_attendance

 id | emp_id   | status       |    Date 
  1 |    51    |   present    |  2017/01/02    
  2 |    52    |   present    |  2017/01/02   





我的尝试:



我试过这个并且它工作正常但是在10列之后......它抛出了mysql语法的错误





What I have tried:

I tried this and its working fine but after 10 columns ...it throws an error of mysql syntax

DELIMITER $$
    DROP PROCEDURE IF EXISTS `attendance_reg`.`new2` $$
CREATE PROCEDURE new2 (IN ddl1 varchar(100))
BEGIN
SET @sql = NULL;
SET @vardomain := CONCAT(ddl1,'%');
    select GROUP_CONCAT(DISTINCT
               CONCAT(' Max(CASE WHEN DATE_FORMAT(b.time_in, ''%D %M'') = ''',
                       DATE_FORMAT(time_in, '%D %M'),
                       ''' THEN b.status END) AS ''',
                       DATE_FORMAT(time_in, '%D %M'), ''''
                     )
                  ORDER BY time_in)
                  INTO @sql
    from emp_attendance   where time_in like @vardomain;
    SET @sql = CONCAT('SELECT b.emp_id ,a.emp_name ,', @sql, ' from emp_details a  join emp_attendance b  on b.emp_id=a.emp_id  and b.time_in like ',@vardomain,' Group By a.emp_name order by a.emp_dept,a.emp_name');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    END $$

DELIMITER ;

推荐答案

DROP PROCEDURE如果存在`attendance_reg`。 new2`
DROP PROCEDURE IF EXISTS `attendance_reg`.`new2`


CREATE PROCEDURE new2(IN ddl1 varchar(100))
BEGIN
SET @sql = NULL;
SET @vardomain:= CONCAT(ddl1,'%');
选择GROUP_CONCAT(DISTINCT
CONCAT('Max(当时为DATE_FORMAT(b.time_in,''%D%M'')=''',
DATE_FORMAT(time_in,'%D) %M'),
'''那么b.status END)AS''',
DATE_FORMAT(time_in,'%D%M'),''''

ORDER BY time_in)
INTO @sql
来自emp_attendance,其中time_in喜欢@vardomain;
SET @sql = CONCAT('SELECT b.emp_id,a.emp_name,',@ sql,'from emp_details a join emp_attendance b on b.emp_id = a.emp_id and b.time_in like',@ vardomain, '按a.emp命令分组a.emp_dept,a.emp_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
CREATE PROCEDURE new2 (IN ddl1 varchar(100)) BEGIN SET @sql = NULL; SET @vardomain := CONCAT(ddl1,'%'); select GROUP_CONCAT(DISTINCT CONCAT(' Max(CASE WHEN DATE_FORMAT(b.time_in, ''%D %M'') = ''', DATE_FORMAT(time_in, '%D %M'), ''' THEN b.status END) AS ''', DATE_FORMAT(time_in, '%D %M'), '''' ) ORDER BY time_in) INTO @sql from emp_attendance where time_in like @vardomain; SET @sql = CONCAT('SELECT b.emp_id ,a.emp_name ,', @sql, ' from emp_details a join emp_attendance b on b.emp_id=a.emp_id and b.time_in like ',@vardomain,' Group By a.emp_name order by a.emp_dept,a.emp_name'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END


DELIMITER;
DELIMITER ;


这篇关于Mysql过程在行到列转换后只显示10列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆