1

昨日、同じコードで同様の質問を投稿しました。書き直したところ、新しい仕様に完全に適合するはずですが、何らかの理由で機能していません。

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% を計算する必要があります。SELECT に start_date と expiry_date を追加し、次の WHERE 関数を追加するのと同じくらい簡単だと思いました。

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

TO_DATEを使用して正確に日付を挿入しています。私の講師は、なぜこれがうまくいかないのかを考え出すのにかなりの時間を費やしましたが、役に立ちませんでした.

エラーを返し続けました - ORA-00932: inconsistent datatypes: expected CHAR got 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 の知識がまったくありませんでした。

4

2 に答える 2

3

合体を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
于 2011-03-03T21:14:22.003 に答える
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;

編集

ビュー定義に ORDER BY があることに気付きました。その場合、ROWNUM メソッドが機能します。通常、ビュー定義に ORDER BY を入れることはお勧めしません。

于 2011-03-04T01:48:17.313 に答える