2017-09-19 13 views
0

私は、各ブランチの顧客の上位5%の姓と顧客番号をリストするために、指定されたデータベース(かなり巨大なのでコードシェアを使用)を使用することになっています。顧客の上位5%を見つけるために、NTILE機能(100/5 = 20、NTILE 20)を使用することに決めました。列は2つの別々のテーブルから引き出されているため、内部結合を使用しました。私の人生のために、私はうんざりしてどこに間違っているのか理解できません。私は "表現が見つからない"というエラーを受け続けますが、正確に何が欠けているのか分かりません。 https://codeshare.io/5XKKBj ERD:https://drive.google.com/file/d/0Bzum6VJXi9lUX1d2ZkhudTE3QXc/view?usp=sharingここNTILE関数とOracleのインナー結合を使用

は、これまでのところ、私のSQLクエリです。ここデータベース

データベースがあります。

SELECT 
    Ntile(20) over 
    (partition by Employee.Branch_no 
    order by sum(ORDERS.SUBTOTAL) desc 
    ) As Top_5, 
    CUSTOMER.CUSTOMER_NO, 
    CUSTOMER.LNAME 
FROM 
    CUSTOMER 
INNER JOIN ORDERS 
    ON 
    CUSTOMER.CUSTOMER_NO = ORDERS.CUSTOMER_NO 
GROUP BY 
    ORDERS.SUBTOTAL, 
    CUSTOMER.CUSTOMER_NO, 
    CUSTOMER.LNAME; 
+0

1)あなたは 'Employee'テーブルを欠いています。 (2) 'GROUP BY'は全ての非集約式を' SELECT'節に含めなければなりません(つまり、 'ORDERS.SUBTOTAL'を集約しているので' GROUP BY'に含めることはできません)。 (3)サブクエリを使用して、ソースデータを照合してから、「NTILE」を適用することを検討してください。 –

+0

Employee.Branch_noを使用しないと、そこに実際にテーブルがあることになりますか?私が考えることができるのは、別のインナー・ジョイントを使用することだけですが、無駄に思えます。あなたはサブクエリを説明できますか? –

+0

結合されていないテーブルは参照できません。それがジョインです。 –

答えて

1

あなたがEmployeeに参加する必要があるとGROUP BYは、すべての非集計式を含める必要があります。あなたは、例えば、小計を生成し、外部クエリでNTILEを取得するには、サブクエリを使用することができます。

SELECT 
    Ntile(20) over 
    (partition by BRANCH_NO 
    order by sum_subtotal desc 
    ) As Top_5, 
    CUSTOMER_NO, 
    LNAME 
FROM (
    SELECT 
    EMPLOYEE.BRANCH_NO, 
    CUSTOMER.CUSTOMER_NO, 
    CUSTOMER.LNAME, 
    sum(ORDERS.SUBTOTAL) as sum_subtotal 
    FROM CUSTOMER 
    JOIN ORDERS 
    ON CUSTOMER.CUSTOMER_NO = ORDERS.CUSTOMER_NO 
    JOIN EMPLOYEE 
    ON ORDERS.EMPLOYEE_NO = EMPLOYEE.EMPLOYEE_NO 
    GROUP BY 
    EMPLOYEE.BRANCH_NO, 
    CUSTOMER.CUSTOMER_NO, 
    CUSTOMER.LNAME 
); 

注:あなたにも、選択リストにBRANCH_NOを含めることができます、それ以外の出力はと混乱になります複数の顧客(顧客が複数の支社の従業員から注文した場合)。

今、あなただけの上位5%を取得するために、上記のクエリをフィルタ処理したい場合、あなたは別のサブクエリで全体を置くことができると、例えばTop_5列に述語を追加します(

SELECT CUSTOMER_NO, LNAME 
FROM (... the query above...) 
WHERE Top_5 = 1; 
関連する問題