在MySql存储过程中显示带动态日期的考勤月报

在MySql存储过程中显示带动态日期的考勤月报,mysql,stored-procedures,Mysql,Stored Procedures,我想要那样的出勤报告 我的考勤表是 STUDENTNAME | ROLLNO | CLASS | 2013-06-01 | 2013-06-02 | 2013-06-03 | 2013-06-04 | 2013-06-05 | 2013-06-06 | 2013-06-07 | 2013-06-08 | 2013-06-09 | 2013-06-10 | ---------------------------------------------------------------------

我想要那样的出勤报告

我的考勤表是

STUDENTNAME   | ROLLNO | CLASS | 2013-06-01 | 2013-06-02 | 2013-06-03 | 2013-06-04 | 2013-06-05 | 2013-06-06 | 2013-06-07 | 2013-06-08 | 2013-06-09 | 2013-06-10 |
------------------------------------------------------------------------------------------------------------------------------------------------------------------
|       Naren |      1 |    22 |          A |          A |          A |          A |          P |          P |          P |          P |          P |          P |
|       Srinu |      2 |    22 |          P |          P |          P |          P |          P |          P |          P |          P |          P |          P |
|        Blah |      3 |    22 |          A |          P |          P |          P |          P |          P |          P |          P |          P |          P |
我有一个存储过程

Att_id   User_id    Attendance_date Present/Absent
1          1              2015-01-01    P
2          2              2015-01-01    L
3          1              2015-01-02    P
4          2              2015-01-02    P
5          1              2015-01-03    L
6          2              2015-01-03    L
SET@sql=NULL;
挑选
组_CONCAT(不同
海螺(
'最大值(ca.date=''时的情况),
日期格式(日期,%Y-%m-%d'),
''然后合并(p.present,''END)为''',
日期\格式(日期,'%Y-%m-%d'),'`
)
)进入@sql
从日历
其中日期>='2013-06-01'
和日期一般语法

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN ca.date = ''',
      date_format(date, '%Y-%m-%d'),
      ''' THEN coalesce(p.present, '''') END) AS `',
      date_format(date, '%Y-%m-%d'), '`'
    )
  ) INTO @sql
FROM calendar
where date>='2013-06-01'
  and date <= '2013-06-05';

SET @sql 
  = CONCAT('SELECT ca.user_id,
               ', @sql, ' 
            from
            (
              select c.date, a.user_id
              from calendar c
              cross join attendance a
            ) ca
            left join attendance  p
              on ca.user_id= p.user_id
              and ca.date = p.attendance_date
            where ca.date>=''2013-06-01''
              and ca.date <= ''2013-06-05''
          group by ca.user_id');
这是一个参数化存储过程,其中包含两个
类型参数,其
数据类型为
另一个是
数据类型为
它们在存储过程的查询中作为
user\u name=name
user\u name=name
传递

您可以使用以下查询调用存储过程

DELIMITER $$

CREATE
    PROCEDURE `moodle`.`procedureName`(IN id INT, IN NAME VARCHAR(20))

    BEGIN
          --    paste QUERY here;
                SELECT * FROM user WHERE user_name = NAME  AND user_id =id;
    END$$

DELIMITER ;
@sql
不是存储过程,它是用户定义的变量,因为
var
在下面的案例中

call procedureName(1,'test');

通过运行上面的查询,您将获得存储在上述变量中的值。

@sql是您的查询中mySQL的用户定义变量,而不是存储过程。你的问题是什么?你想为你的上述查询使用一个存储过程吗?是的,我想为上述查询使用Mysql存储过程。你的查询工作正常吗?不工作,我不知道如何在该查询中传递Mysql的用户定义变量,我正在试着获取每月的考勤报告。你可以将你的过程参数化,就像我用一般语法编写的那样在我的更新中,我将以这种方式尝试查询我已经为您添加了一些描述当我尝试执行查询时,它显示了错误at=CONCAT('SELECT ca.user_id',@sql',此处实际上您的查询有一些额外的'quotes',首先,通过正常运行检查您的查询,如果它运行得很好,然后执行该过程。您没有提供查询中使用的所有表的结构,例如:Calendar,因此我无法再帮助您了
SET @var='testing varible';
SELECT @var;