随笔-199  评论-203  文章-11  trackbacks-0
--今天一天爲了計算一個全勤獎,快把我給鬱悶死了,如下是我今天的一點成績,那位朋友如果有更好的建議歡迎--指教!謝謝...!
SELECT 年月,部門編號,員工ID,員工卡號,姓名,事假天數,曠工天數,/*進廠日期,上班日期,離職日期,上班時間,離職時間,*/
  --根據離職人員離職日期分給相應全勤獎.
  CASE 離職時間 WHEN 0 THEN 全勤獎 WHEN 1 THEN 全勤獎-10 WHEN 2 THEN 全勤獎-20 ELSE 全勤獎*0 END 全勤獎
  FROM(
  --C
  SELECT 年月,部門編號,員工ID,員工卡號,姓名,事假天數,曠工天數,進廠日期,上班日期,離職日期,上班時間,離職時間,
    --曠工者全勤為0,新進員工3號以後進廠的全勤為0,離職人員如果是在本月倒數第三天之前的全勤為0.
    CASE WHEN 曠工天數> 0 OR 上班時間 >= 3 OR 離職時間 >=3 THEN 0
       WHEN 上班時間= 2 THEN --新進員工2號進廠的全勤為10
       CASE WHEN 事假天數 = 0    THEN 10
          WHEN 事假天數 = 0.5 THEN 5
          WHEN 事假天數 >= 1  THEN 0 END
       WHEN 上班時間=1 THEN --新進員工1號進廠的全勤為20
        CASE WHEN 事假天數 = 0    THEN 20
          WHEN 事假天數 = 0.5 THEN 15
          WHEN 事假天數 = 1.5 THEN 5
          WHEN 事假天數 >= 2  THEN 0 END
     WHEN 上班時間=0 THEN --老員工全勤為30
       CASE WHEN 事假天數 = 0    THEN 30
          WHEN 事假天數 = 0.5 THEN 25
          WHEN 事假天數 = 1    THEN 20
          WHEN 事假天數 = 1.5 THEN 15
          WHEN 事假天數 = 2    THEN 10
          WHEN 事假天數 = 2.5 THEN 5
          WHEN 事假天數 >= 3    THEN 0 END   
     END 全勤獎
  FROM(
   SELECT 年月,部門編號,員工ID,員工卡號,姓名,進廠日期,上班日期,離職日期,
  --如果進廠年月等于上班年月,表示此員工為新員工.
  CASE WHEN LEFT(進廠日期,6)=LEFT(上班日期,6) THEN CAST(RIGHT(上班日期,2)AS INT) ELSE 0 END 上班時間,
  --如果進廠年月等于上班年月,表示此本月即將離職
  CASE WHEN LEFT(離職日期,6)='200902' THEN
   CAST(RIGHT(CONVERT(VARCHAR(8),DATEADD(D,-1,DATEADD(M,1,'20090201')),112),2) AS INT)-
   CAST(RIGHT(離職日期,2)AS INT)
   ELSE 0 END  離職時間,
  ISNULL(SUM(CASE 假別 WHEN '事假' THEN 假別天數  END),0) 事假天數,
  ISNULL(SUM(CASE 假別 WHEN '曠工' THEN 假別天數 END),0) 曠工天數
   FROM(
    SELECT D.年月,D.部門編號,D.員工ID,D.員工卡號,D.姓名,D.假別,D.假別天數,E.進廠日期,E.上班日期,E.離職日期
     FROM(
     SELECT C.年月,A.部門編號,A.員工ID,A.員工卡號,A.姓名,
       CASE WHEN C.假別!=  '曠工' AND C.假別!='輪休' THEN '事假' ELSE C.假別 END 假別,SUM(C.天數) 假別天數--,進廠日期
      FROM SPG_TECH.每日刷卡 A 
      INNER JOIN ( --員工本月最後一天在那個部門上班算那個部門
         SELECT 員工ID,MAX(日期) AS 日期   FROM SPG_TECH.每日刷卡
          WHERE CONVERT(CHAR(6),日期,112) LIKE '200902'+'%' AND 上班!='' 
                  GROUP BY 員工ID
         )B
      ON A.員工ID=B.員工ID AND A.日期=B.日期
      INNER JOIN( --根據員工ID,統計底薪天數
         SELECT CONVERT(CHAR(6),日期,112) 年月,員工ID,員工卡號,姓名,
           CASE 假別 WHEN '' THEN 備注 ELSE 假別 END AS 假別,備注,
           CASE  WHEN 假別 ='' AND 備注 = '' THEN 0 ELSE COUNT(備注) END 備註,
           CASE WHEN 備注 != '曠工' AND 備注 != '' THEN COUNT(備注) * 0.5 ELSE
           CASE  WHEN 假別 ='' AND 備注 = '' THEN 0 ELSE COUNT(備注) END END 天數
          FROM SPG_TECH.每日刷卡
          WHERE  CONVERT(CHAR(6),日期,112) LIKE '200902'+'%' --AND 姓名='朱小女'
          GROUP BY CONVERT(CHAR(6),日期,112),員工ID,員工卡號,姓名,假別,備注
       )C
      ON A.員工ID = C.員工ID
     
      WHERE 部門編號 IN( SELECT 部門編號  FROM SPG.SPG_TECH.部門資料     --只針對針車部門,過濾其它部門
          WHERE 廠內外='內' AND 是否職干!='是' AND 單位區別='A'  AND 部門編號 LIKE '%' +'-S'+'%')
          AND 部門編號='BL3-S4'  
      GROUP BY C.年月,A.員工ID,A.姓名,A.員工卡號,A.部門編號,CASE WHEN C.假別!=  '曠工' AND C.假別!='輪休' THEN '事假' ELSE C.假別 END
   
     )D
     INNER JOIN(
      SELECT A.員工ID,A.員工卡號,A.姓名,CONVERT(CHAR(8),MIN(A.日期),112) 上班日期,
       CONVERT(CHAR(8),B.進廠日期,112) 進廠日期,CONVERT(CHAR(8),B.離職日期,112) 離職日期
       FROM SPG_TECH.每日刷卡 A
       INNER JOIN SPG_TECH.員工資料 B
       ON A.員工ID = B.員工ID
       WHERE CONVERT(CHAR(6),日期,112) LIKE  '200902'+'%' -- AND A.部門編號='BL2-S1'
       GROUP BY A.員工ID,A.員工卡號,A.姓名,B.進廠日期,B.離職日期
       )E
     ON D.員工ID = E.員工ID
  )F GROUP BY  年月,部門編號,員工ID,員工卡號,姓名,進廠日期,上班日期,離職日期
 )G
)H ORDER BY 年月,部門編號,員工卡號
posted on 2009-04-09 19:32 Werther 阅读(903) 评论(0)  编辑  收藏 所属分类: 15.SQL Server

只有注册用户登录后才能发表评论。


网站导航: