2011-03-03 2 views
1

어제 동일한 코드를 사용하여 유사한 질문을 게시했습니다. 다시 작성 했으므로 새로운 사양에 완벽해야하지만 어떤 이유로 작동하지 않습니다.SQL 쿼리 내 복잡한 계산

Oracle 10g Express를 사용하고 있습니다.

아래 코드는 소득 개업자의 상위 10 %를 대상으로합니다.

AND contract.start_date >= 01-01-10 
AND contract.expiry_date <= 01-01-11 

:

작년의 상위 10 %를 일할 필요가
CREATE VIEW rich_solicitors AS 
select notes.time_spent*rate.rate_amnt+coalesce(special_rate.s_rate_amnt,0) 
AS solicitor_made, notes.solicitor_id 
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate 
WHERE notes.solicitor_id = solicitor.solicitor_id 
AND solicitor.solicitor_id = solicitor_rate.solicitor_id 
AND solicitor_rate.rate_id = rate.rate_id 
AND notes.case_id = case.case_id 
AND case.contract_id = contract.contract_id 
AND contract.contract_id = special_rate.contract_id (+) 
ORDER BY -solicitor_made; 


SELECT * FROM rich_solicitors 
WHERE ROWNUM <= (SELECT COUNT(*)/10 FROM rich_solicitors); 

, 나는 그것이 시작일를 추가하는 것처럼 쉽게하고, 선택하고 다음 WHERE 기능을 추가하는 EXPIRY_DATE 것이라고 생각 TO_DATE를 사용하여 날짜를 corectly 삽입했습니다. 내 강사는 왜이 일을하지 않고 쓸데없는 일을하는지 나와 함께 좋은 시간을 보냈습니다. 나는 또한 날짜 형식을 정의하는 시도 CHAR이 번호

을 가지고 기대하고 여전히 같은 오류

CREATE VIEW rich_solicitors1 AS 
SELECT notes.time_spent*rate.rate_amnt+coalesce(special_rate.s_rate_amnt,0) AS solicitor_made, notes.solicitor_id, TO_CHAR(contract.start_date, 'DD-MM-YY'), TO_CHAR(contract.expiry_date, 'DD-MM-YY') 
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate 
WHERE notes.solicitor_id = solicitor.solicitor_id 
AND solicitor.solicitor_id = solicitor_rate.solicitor_id 
AND solicitor_rate.rate_id = rate.rate_id 
AND notes.case_id = case.case_id 
AND case.contract_id = contract.contract_id 
AND contract.contract_id = special_rate.contract_id (+) 
AND contract.start_date >= 01-01-10 
AND contract.expiry_date <= 01-01-11 
ORDER BY -solicitor_made; 

어떤 아이디어가 : 일치하지 않는 데이터 유형을 : ORA-00932 -

그것은 오류를 반환에 보관?

많은 비평, 비평은 대단히 감사합니다. 나는 약 9 일 전에 나는 전혀 SQL 지식이 없었기 때문에 학생이었고 이것으로 첫 발걸음이었습니다.

+0

여기에 코드를 올바르게 포맷 할 수없는 것 같습니다. 브라우저 오류입니까? 어떤 충고? – Phil

+0

@ Phil : http://stackoverflow.com/editing-help를 살펴보십시오. – BoltClock

+0

@ NullUserException : 이봐, 돌아 왔어! 오래되었습니다 :) – BoltClock

답변

3

당신은 ROWNUM을 사용하여 쿼리 하지 내가 생각할 수있는 "최고"의 정의에 의해 상위 10 %를 얻을 것이다, 내가 NVL 기능

SELECT notes.time_spent*rate.rate_amnt+NVL(special_rate.s_rate_amnt,0) 
AS solicitor_made, notes.solicitor_id, TO_CHAR(contract.start_date, 'DD-MM-YY'), 
TO_CHAR(contract.expiry_date, 'DD-MM-YY') 
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate 
WHERE notes.solicitor_id = solicitor.solicitor_id 
AND solicitor.solicitor_id = solicitor_rate.solicitor_id 
AND solicitor_rate.rate_id = rate.rate_id AND notes.case_id = case.case_id 
AND case.contract_id = contract.contract_id 
AND contract.contract_id = special_rate.contract_id (+) 
AND contract.start_date >= to_date('01-01-10','MM-DD-YY') 
AND contract.expiry_date <= to_date('01-01-11' ,'MM-DD-YY') 
ORDER BY solicitor_made 
+0

Drat! 너는 나를 때렸다! 망할 전화가 울렸다. :-) –

+0

그게 내가 여기에 지점 또는 두 가지를 수집 할 수 있도록 당신과 얘기하려고 전화에서 나를했다 ;-) – lisa

+0

불행히도, 여전히 같은 오류를 반환합니다. – Phil

2

필하여 유착을 교체 한 시도 할 수 있습니다.

그 뜻이 예 :

SELECT * FROM (
    SELECT solicitor_made, solicitor_id 
     ,NTILE(10) OVER (ORDER BY solicitor_made DESC) decile 
    FROM rich_solicitors 
) WHERE decile = 1; 

편집

그냥 당신이 당신의 뷰 정의에 의해 주문이났습니다. 어떤 경우 ROWNUM 메서드가 작동합니다. 일반적으로 뷰 정의에 ORDER BY를 넣지 않는 것이 좋습니다.

+0

나는 가장 높은 소득자가 처음이고 행의 첫 번째 % 만 표시하도록 주문하여 맨 위로 올라가지만, obviuosly 훨씬 더 정확하게 .... 잘 다른 권리입니다 .. 감사합니다. – Phil