我有一張表,其中列出了員工成爲活動/非活動日期的列表,並且我想要計算員工在特定日期範圍內處於活動狀態的週數。SQL查找僱員在兩個日期之間活躍的週數
所以表(ps_job)將有這樣的價值觀:
EMPLID EFFDT HR_STATUS
------ ----- ------
1000 01-Jul-11 A
1000 01-Sep-11 I
1000 01-Jan-12 A
1000 01-Mar-12 I
1000 01-Sep-12 A
查詢需要向我展示周,這EMPLID活躍,從01月11至31日,DEC-數量12。
期望的結果集將是:
EMPLID WEEKS_ACTIVE
------ ------------
1000 35
我通過從獲得的SQL添加的結果得到了以下的數35:
SELECT (NEXT_DAY('01-Sep-11','SUNDAY') - NEXT_DAY('01-Jul-11','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
SELECT (NEXT_DAY('01-Mar-12','SUNDAY') - NEXT_DAY('01-Jan-12','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
SELECT (NEXT_DAY('31-Dec-12','SUNDAY') - NEXT_DAY('01-Sep-12','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
問題是我不能似乎想出瞭如何創建一個單一的查詢語句,該語句將遍歷特定日期範圍內的每個員工的所有行,並返回每個emplid和他們活動的週數。我寧願使用基本的SQL而不是PL/SQL,以便將其轉移到可由用戶運行的PeopleSoft查詢中,但如果需要的話,我願意使用Oracle SQL Developer爲用戶運行它。
數據庫:Oracle數據庫11g企業版發佈11.2.0.3.0 - 64位生產
你能更好地解釋你的需求嗎?您的表格中可以有多個條目嗎?我的意思是,如果員工是活躍的,每個星期你都會儲存?或者每個月? – Madthew 2013-05-08 17:29:41
因此,每當員工被聘用或終止時,表格都會更新。在這種情況下,員工被聘用01年7月1日,所以他們的HR_STATUS是A(ctive)。然後他們被終止01年9月11日,所以他們的HR_STATUS是我(無效)。然後他們在1月1日至12日被重新聘用,12月1日再次被終止,然後在12月9日重新入職,直到今天仍然活躍。這是一個極端的例子,但是顯示了員工在激活狀態和非激活狀態之間彈跳如何使查詢更加困難。 – BarrettNashville 2013-05-08 17:33:39
在你的例子中,你試圖把日期推到星期日。假設僱員在本週五(5/10/2013)聘用,並於下週的週一(2013年5月13日)結束。他們的「週數」可以是0(3天,四捨五入= 0周),1(3天=一週的一部分)或2(兩週內有效)。你想報告哪個? – 2013-05-08 17:38:14