--今天一天爲了計算一個全勤獎,快把我給鬱悶死了,如下是我今天的一點成績,那位朋友如果有更好的建議歡迎--指教!謝謝...!
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 阅读(898)
评论(0) 编辑 收藏 所属分类:
15.SQL Server