Сложный расчет в SQL-запросе - PullRequest
1 голос
/ 04 марта 2011

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

Я использую 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 и добавить следующую функцию WHERE:

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

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

Он продолжал возвращать ошибку - ORA-00932: несовместимые типы данных: ожидаемый CHAR получил NUMBER

Iтакже попытался определить формат даты, и это все еще возвращает ту же ошибку

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.

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Можете ли вы попробовать, я заменил вашу коалесцию на функцию 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
2 голосов
/ 04 марта 2011

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

Пример, который будет:

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

РЕДАКТИРОВАТЬ

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

...