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