2011-03-03 4 views
1

Вчера я опубликовал аналогичный вопрос с тем же кодом, я переписал его и должен быть идеальным для новой спецификации, но по какой-то причине он не работает.Сложный подсчет в SQL-запросе

Я использую Oracle 10g Express.

В приведенном ниже коде представлены 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); 

мне нужно работать в 10% в прошлом году, я думал, что будет так же легко, как добавление START_DATE и EXPIRY_DATE к SELECT, и добавив следующую команду, где функции:

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

Я вставляю дату, используя TO_DATE. Мой преподаватель провел хороший час со мной, выясняя, почему это не сработает, но безрезультатно.

Он продолжал возвращенная ошибку - ORA-00932: несовместимые типы данных: ожидается 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; 

какие-либо идеи?

Огромное спасибо, любая критика очень ценится, я студент и на первых своих шагах с этим, до 9 дней назад, у меня не было никаких знаний SQL.

+0

Я, похоже, не могу правильно отформатировать свой код здесь, это ошибка браузера? любой совет? – Phil

+0

@Phil: взгляните на http://stackoverflow.com/editing-help. – BoltClock

+0

@NullUserException: Эй, ты вернулся! Это было давно :) – BoltClock

ответ

3

Вы можете попробовать я заменил свой COALESCE функцией 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

Фил, ваш запрос с помощью ROWNUM будет не получить первые 10% от любого определения «сверху», что я могу думать.

пример, который является:

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

EDIT

Просто заметил, у вас есть ORDER BY в вашем определении вида. В этом случае ваш метод ROWNUM будет работать. Обычно я рекомендую не вводить ORDER BY в определение представления.

+0

Я только добираюсь до вершины, заказывая так, чтобы наивысшие работники были первыми и отображали только первый% строк, но это obviuosly гораздо точнее .... ну его право, которое отличается .. спасибо. – Phil

Смежные вопросы