先甩出来需求吧: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