2017-09-19 11 views
0

각 분기에 대해 고객의 상위 5 % 고객의 성 및 고객 번호를 나열하기 위해 주어진 데이터베이스 (Codehare를 사용하기에 꽤 큼)를 사용해야합니다. 고객의 상위 5 %를 찾으려면 NTILE Function (100/5 = 20, NTILE 20)을 사용하기로 결정했습니다. 열은 두 개의 개별 테이블에서 가져 오므로 내부 조인을 사용했습니다. 내 인생에서 내가 어디로 잘못 가고 있는지 알 수 없다. "누락 된 표현"오류가 계속 발생하지만 정확히 무엇이 누락되었는지 모릅니다. 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;