員工工時明細報表實現思路(包含 年月日 列)

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

相關文章
相關標籤/搜索