2011-03-03 30 views
1

同じコードで昨日同じような質問を投稿しましたが、私は書き直しました。新しい仕様には完璧でなければなりませんが、何らかの理由で動作しません。SQLクエリ内の複雑な計算

私はOracle 10g Expressを使用しています。

以下のコードは、募集要項の上位10%を作成しています。私は昨年の上位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); 

、私はそれを選択するために、START_DATEとEXPIRY_DATEを追加すると、以下の機能追加と同じくらい簡単だろうと思った:

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

をTO_DATEを使用して日付を挿入しています。私の講師は、なぜこのwouldntの仕事が無駄に働いているのか、私と一緒に楽しい時間を過ごしました。

それはエラーを返すに保管 - ORA-00932:一貫性のないデータ型を:CHARはNUMBER

を得た予想私はまた、日付形式を定義し、今でも任意のアイデアが

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

あなたは私が

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

それはあなたに話をしようと電話に私だったので、ここでポイントまたは2を集めることができます;-) – lisa

+0

残念ながら、残念ながら同じエラーを返します。 – Phil

2

NVL関数でフィルをあなたの合体を交換した試用でき、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

私は最高の稼ぎ手が最初で行の最初の%だけを表示するように注文することでトップに辿り着いていますが、これははるかに正確ではっきりしています。 – Phil