2015-01-28 2 views
1

에 대한보기를 만듭니다나는 다음과 같은 두 테이블에서 일하고 있어요 작업 표

CREATE TABLE Consultant_Alloc ( 
    project_no  number(6), 
    activity_no  number(4) NOT NULL, 
    consultant_id char(7) NOT NULL UNIQUE, 
    allocated_hours number(3) NOT NULL, 
    hours_worked number(3), 
     -- SUM(Consultant_Alloc.allocated_hours) 
     CONSTRAINT pk_project_activity_consultant PRIMARY KEY (project_no, activity_no, consultant_id), 
     CONSTRAINT fk_consultant_id FOREIGN KEY (consultant_id) REFERENCES Consultant (consultant_id) 
      ON DELETE CASCADE, 
     CONSTRAINT fk_project_no_activity_no_budget FOREIGN KEY (project_no, activity_no, budget) REFERENCES Activity (project_no, activity_no, budget_hours) 
      ON DELETE CASCADE, 

); 


CREATE TABLE Activity (
    activity_no  number(4) NOT NULL, 
    activity_name varchar2(50), 
    project_no  number(6) NOT NULL, 
    allocated_hours number(3) CHECK (allocated_hours > 0), 
    start_date  date, 
    end_date  date, 
    comp_date  date, 

     CONSTRAINT pk_Activity_project_no_activity_no PRIMARY KEY (project_no, activity_no), -- Each activity must be unique 
     CONSTRAINT fk_Activity_project FOREIGN KEY (project_no) REFERENCES Project (project_no) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
     CONSTRAINT ck_dates CHECK (start_date >= end_date) 
); 

내가 이전 달력의 달 프로젝트에 참여 시간의 수를 자세히 오라클 SQL 뷰를 작성해야합니다. 나는 내 사업에 대해 이것을 배우고 있으며 이전 캘린더 달의 모든 프로젝트를 참조하는 방법을 알 수 없기 때문에 이것을 어떻게 할 수 있는지에 대한 몇 가지 지침을 원합니다.

감사

CREATE VIEW time_sheet 
AS SELECT CA.consultant_id CONSULTANT, A.project_no PROJECT, A.activity_no ACTIVITY, CA.hours_worked HOURS 
FROM Consultant_Alloc CA, Activity A 
WHERE -- in previous calendar month 
GROUP BY CA.consultant_id 

난까지 해요 곳입니다.

+0

또는 어디에서든지이 것을 배울 수 있습니다 – user3414871

답변

0

트릭은 지정된 기간이 start_dateend_date 범위와 겹치는 지 확인하는 것입니다. 맞습니까? (아니면 comp_date 나중에 할 수 있습니까?) 범위 start_dateend_date 충분합니다 가정 할거야; ., 귀하의 경우에는

(StartA <= EndB) and (EndA >= StartB) 

, StartAstart_date 것, 그리고 EndAend_date 것 : 당신이 comp_date 필요한 경우에 그 연결 할 수 있어야한다

공식을 교차 날짜를 결정하기 위해이 같이 보입니다 StartB은 지난 달의 첫 번째 날이고 EndB은 지난 달의 마지막 날이됩니다. 그러나 오라클 날짜에는 시간 구성 요소가 포함되어 있기 때문에 EndB월의 첫 번째 일이고 월은 <=이 아닌 <을 사용합니다. 다음 그때 할 수있는, 내가 특정 프로젝트에 할당 된 시간을 얻기 위해 원하는 경우

SELECT activity_no, activity_name, project_no, allocated_hours 
    FROM Activity 
WHERE start_date < TRUNC(sysdate, 'MONTH') 
    AND end_date >= TRUNC(ADD_MONTHS(sysdate, -1), 'MONTH'); 

: 그래서

지난 달 일어난 모든 활동을 얻을 수

SELECT project_no, SUM(allocated_hours) 
    FROM Activity 
WHERE start_date < TRUNC(sysdate, 'MONTH') 
    AND end_date >= TRUNC(ADD_MONTHS(sysdate, -1), 'MONTH'); 
GROUP BY project_no; 

여기 어려움 하지만 활동에 대한 특정 날짜가 없다는 것입니다. 그것은 다른 달을.을 수있는 것처럼 보입니다. 따라서 특정 달에 프로젝트에 할당 된 시간을 찾는 것이 불가능하지는 않더라도 어렵습니다.. 내가 할 수있는 것은 활동의 날짜 범위가 그 달의 날짜 범위와 교차 한 주어진 프로젝트에 할당 된 시간을 찾는 것입니다. 나는 그런 다음, 주어진 활동을 위해, 당신은 예를 들어 시간 동안 로그 테이블을 가져야

CREATE TABLE activity_log 
(activity_no NUMBER(4) NOT NULL 
, consultant_id CHAR(7) NOT NULL 
, log_hours NUMBER(3) CHECK (log_hours> 0) 
, log_dt DATE DEFAULT SYSDATE NOT NULL 
); 

을 생각하고, 나는 당신이 시간의 보고서를 얻을 수있을 것입니다, 만 생각하는 프로젝트에 근무 주어진 달 :

테이블도 컨설턴트에 의해 고장을 얻을 수 있도록 것 같은
SELECT a.project_no, SUM(al.log_hours) 
    FROM activity a INNER JOIN activity_log al 
    ON a.activity_no = al.activity_no 
WHERE TRUNC(log_dt, 'MONTH') = TRUNC(ADD_MONTHS(SYSDATE, -1), 'MONTH') 
GROUP BY a.project_no; 

: 그런데

SELECT a.project_no, al.consultant_id, SUM(al.log_hours) 
    FROM activity a INNER JOIN activity_log al 
    ON a.activity_no = al.activity_no 
WHERE TRUNC(log_dt, 'MONTH') = TRUNC(ADD_MONTHS(SYSDATE, -1), 'MONTH') 
GROUP BY a.project_no, al.consultant_id; 

, U에 대한 이유가 결코 1 문자 열을 생성 할 때 키 입력을 저장하는 것을 제외하고는 이상의 오라클에 CHAR을 입력하십시오 (예 : VARCHAR2(1) 대신 CHAR(1)).

+0

매우 도움이되는 David ... 그래서 활동 기록이 필요합니까? – user3414871

+0

나는 주위에 어떤 방법도 보이지 않는다. 시간표를 위해 누가 언제 어떤 일을했는지 ​​알아야한다. –

관련 문제