2014-11-05 78 views
0

的由天,然後再分組小時和我有一個表是這樣的:中的Oracle APEX選擇一個星期

CREATE TABLE "ATTENDANCE_HOURS" 
    ("ID" NUMBER NOT NULL ENABLE, 
    "PERSON_ID" NUMBER, 
    "PROJECT_ID" NUMBER, 
    "FROM_X" DATE NOT NULL ENABLE, 
    "TO_X" DATE NOT NULL ENABLE, 
    "NOTE" VARCHAR2(300), 
    "APPROVED" NUMBER DEFAULT 0 NOT NULL ENABLE, 
    "APPROVAL_NOTE" VARCHAR2(300), 
    "DAY" DATE NOT NULL ENABLE, 
    CONSTRAINT "CHECK_TIMES" CHECK (TO_CHAR(TO_X, 'HH24MI') > TO_CHAR(FROM_X, 'HH24MI')) ENABLE, 
CONSTRAINT "ATTENDANCE_HOURS_PK" PRIMARY KEY ("ID") 
    USING INDEX ENABLE 
    ) 

注:我不能改變表。只是沒有。 我需要爲每個人選擇他們每週工作多少個小時。已經有我一天(感謝StackOverflow上)有多少個小時,看起來像這樣一個選擇:

select 
    (MAX("TO_X") - MIN("FROM_X"))*24 - 
    (max(case when PROJECT_ID = 21 then to_x else to_date('01012000','DDMMYYYY') end) - 
    max(case when PROJECT_ID = 21 then from_x else to_date('01012000','DDMMYYYY')  end))*24 AS TIME_SPENT 
// project id = 21 is break 
from #OWNER#.ATTENDANCE_HOURS 
GROUP BY DAY 

什麼發生在我,是集團未來的條目按週數,並把整個事情到SUM() ,但是,它不起作用,它說:不是一個單組的功能。 或者我應該開始玩意見?

+1

目前還不清楚列的含義。什麼定義了一個小時工作?每個項目每人每天有一行嗎?你爲什麼特殊套管項目ID 21? – Ben 2014-11-05 11:45:52

+0

@Ben b/c項目21是不計入工作時間的中斷。 – Lea 2014-11-05 12:15:44

回答

1

每個人在一個星期的總時數會是這個樣子:

select person_id, to_char(day, 'YYYY-WW') as week, 
     sum(to_x - from_x) as hours_worked 
from #OWNER#.ATTENDANCE_HOURS 
group by person_id, to_char(day, 'YYYY-WW') 
order by person_id, week; 

我不知道額外的邏輯是什麼在項目ID。你的問題沒有解釋它,所以我把它作爲計算小時數的總和去掉了。如果重要,可以將其重新添加。

+0

項目編號是用來區分人們工作的項目,並且有一個特殊項目 - 休息時間,它不會被計入工作小時數。 – Lea 2014-11-05 12:17:50

+1

對此答案+1。但要時刻關注周的使用情況,特別是對於貝寧和年底。例如,您預計像2015-01一樣的2015年1月初的to_char(日,'YYYY-WW'),但結果可能是2015 - 52年,因爲1月1日屬於上一年的最後一週。有點混亂 – Calipso 2014-11-05 13:20:05

0

像這樣(未經測試)?

select person_id 
    , trunc(from_x,'iw')          first_day_of_iso_week 
    , sum((to_x - from_x) * 24)        all_hours 
    , sum((case project_id when 21 then to_x - from_x) * 24) break_hours 
    from attendance_hours 
group by person_id  -- for each person 
    , trunc(from_x,'iw') -- for each ISO-week 

也許你需要一個額外的檢查約束,告訴to_x和from_x的日期部分應該是一樣的,檢查(TRUNC(from_x)= TRUNC(to_x))?

編輯:我現在看到你在表格中也有一個superflous DAY列。這不是一個好主意,因爲您現在必須檢查(trunc(day)= trunc(to_x))和trunc(day)= trunc(from_x)。如果可以的話,擺脫day列:它已經包含在你的from_x和to_x列中。

+0

奇怪,你有很多分但沒有金牌! – 2014-11-05 11:57:23

0

下面的查詢讓你的工作時間減去休息之和爲每個人(提供項目21周來打破和所有其他意味着工作):

select person_id, 
    sum(case when project_id = 21 then -1 else 1 end * (to_x - from_x)) * 24 
from #OWNER#.ATTENDANCE_HOURS 
group by person_id; 

爲了得到這個每天可以相當複雜,當工作可以超過午夜(甚至超過兩天)。只要我們假設from_x和當天to_x是跳投,我們得到:

select person_id, trunc(from_x), 
    sum(case when project_id = 21 then -1 else 1 end * (to_x - from_x)) * 24 
from #OWNER#.ATTENDANCE_HOURS 
group by person_id, trunc(from_x); 

要獲得那麼這一週將是:

select person_id, trunc(from_x, 'IW'), 
    sum(case when project_id = 21 then -1 else 1 end * (to_x - from_x)) * 24 
from #OWNER#.ATTENDANCE_HOURS 
group by person_id, trunc(from_x, 'IW'); 

編輯:哦,我只注意到我對數據不夠了解。從上午9點到上午11點,從上午10點到上午10點15分還有一個休息時間,項目的出勤範圍是多少?然後我的查詢工作。或者那會是兩個項目參加者,其中一個從上午9點到上午10點,另一個從上午10點15分到上午11點?那麼你需要sum(case when project_id = 21 then 0 else to_x - from_x end) * 24

編輯:好的,你在你的評論說PROJECT_ID = 21不能重疊,只是簡單地從查詢中排除它說:

select person_id, trunc(from_x, 'IW'), sum(to_x - from_x) * 24 
from #OWNER#.ATTENDANCE_HOURS 
where project_id <> 21 
group by person_id, trunc(from_x, 'IW'); 
+0

對不起,我忘了提及!在每個項目上花費的時間不能重疊,所以你描述的第二種方法是正確的。 :) – Lea 2014-11-05 12:23:03

+0

好的,我已經編輯了我的答案,以提供更簡單的解決方案。 – 2014-11-05 12:30:54