员工工时明细报表实现思路(包含 年月日 列)

先甩出来需求吧:html

就是这样的一个常规明细报表。java

其实实现思路很简单------也是一条sql搞定:mysql

以下一个日志表,假设就有三个字段  员工id,工时,填报时间,sql


-- 员工工时明细报表  --- 
-- 以2016年9月份为例,将 每一个不一样天的日志工时,AS 为 不一样的列,当天没有工时为0函数

SELECT fz_data_008_id, 
(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',6)) THEN fdaliyWorkHours ELSE 0 END )AS COL6,
(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',7)) THEN fdaliyWorkHours ELSE 0 END )AS COL7,
(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',8)) THEN fdaliyWorkHours ELSE 0 END )AS COL8,
(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',9)) THEN fdaliyWorkHours ELSE 0 END )AS COL9,
fdate,day(fdate),fdaliyWorkHours from  w_logmanager a   WHERE year(fdate)=2016 AND month(fdate)=9 AND  fz_data_008_id = 625

获得以下结果oop

-- 再合并汇总一下,就是每一个人当天的工时了。日志

SELECT fz_data_008_id, 
SUM(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',6)) THEN fdaliyWorkHours ELSE 0 END )AS COL6,
SUM(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',7)) THEN fdaliyWorkHours ELSE 0 END )AS COL7,
SUM(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',8)) THEN fdaliyWorkHours ELSE 0 END )AS COL8,
SUM(CASE WHEN (date_format(a.fdate,'%Y-%c-%e') = concat(2016,'-',9,'-',9)) THEN fdaliyWorkHours ELSE 0 END )AS COL9,
fdate,day(fdate),fdaliyWorkHours from  w_logmanager a   WHERE year(fdate)=2016 AND month(fdate)=9 
GROUP BY fz_data_008_id 

获得以下:code


--  这就是 目标sql,只要调用存储过程  拼接成以上形式,便可查询出明细工时报表了。orm

-- 而后就是插入临时表,再插入汇总数据。 htm

 

下面是我写的一个 存储过程Demo,sql拼接执行语法 和 会用到的循环语句  

DROP PROCEDURE IF EXISTS `test_procedure`;
CREATE PROCEDURE `test_procedure`(in uname varchar(200),OUT returnMSG VARCHAR(200),OUT  rnNum1 int,OUT rnNum2 

int)   -- in为 传入参数, out 为返回参数
BEGIN
	
  DECLARE sqlStr VARCHAR(200) ;	 --  声明普通变量 
	DECLARE i int;	 --  声明普通变量 
	DECLARE n int;	 --  声明普通变量 


	-- 拼接sql执行
	SET  sqlStr = 'update s_user set fage = 222 where fusername= ';
	SET  sqlStr = CONCAT(sqlStr,'\'',uname,'\'');

	SET @sql = sqlStr; -- @为 声明会话变量,执行sql必须 声明会话变量 
	PREPARE stmt FROM  @sql;  --  添加sql语句
	EXECUTE stmt;  -- 执行sql
  DEALLOCATE PREPARE stmt;

	 

	-- 下面是两种循环方式,写报表确定用得着。
  
	SET i = 0;  
	loop1:LOOP   -- loop循环
		IF i> 5 THEN 
				select fid,fusername,i AS 'i' from s_user;
				LEAVE loop1;
		ELSE
				SET i = i+1;
		END IF; 
	END LOOP loop1;
	
	-- while循环
	SET n = 0;
	WHILE n <= 10 DO
			SET n = n + 1;
	END WHILE;

  SET returnMSG = 'OK';
	SET rnNum1 = i;
	SET rnNum2 = n;
END 

CALL  test_procedure('huangqi',@msg,@num1,@num2);
SELECT @msg,@num1,@num2

最后 拼接 where 条件时  会用到 “行专列,列转行” 在这里啦 (这个很是重要,不会运用会多些好多代码):

 

    group_concat 函数用来行专列

    mysql.help_topic 列转行; 

能够搜一下查一下怎么用哦~ 能够参考:http://www.2cto.com/database/201208/149460.html

相关文章
相关标签/搜索