2017-12-12 14 views
0

에서 대부분의 주문에 고객의 이름과 성을 선택합니다 I이 다음 표오라클 SQL 2017

f_orders 다음 데이터

ORDER_NUMBER ORDER_DATE ORDER_TOTAL CUST_ID STAFF_ID 
    5678   10-Dec-2017 103.02  123 12 
    9999   10-Dec-2017  10  456 19 
    9997   09-Dec-2017  3  123 19 
    9989   10-Dec-2016  3  123 19 

ORDER_NUMBER NUMBER(5,0) 
ORDER_DATE  DATE 
ORDER_TOTAL  NUMBER(8,2) 
CUST_ID   NUMBER(5,0) 
STAFF_ID  NUMBER(5,0) 

f_customers

나는 2017

내 질문이

SELECT f_customers.first_name, 
     f_customers.last_name, 
     count(order_total) 
FROM f_orders JOIN f_customers 
ON f_customers.id = f_orders.CUST_ID 
WHERE TO_CHAR(order_date, 'DD-Mon-YYYY') LIKE '%2017' 
GROUP BY f_customers.first_name, f_customers.last_name 
HAVING count(order_total) = (SELECT max(count(cust_id)) 
          FROM f_orders 
          GROUP BY cust_id) 
처럼 보이는 년에 배치 대부분의 주문 wthi 고객의 이름을 표시하는데있어

ID FIRST_NAME LAST_NAME ADDRESS 
123  Cole  Bee 123 Main Street 
456  Zoe  Twee 1009 Oliver Avenue 

다음 데이터

ID   NUMBER(5,0) 
FIRST_NAME VARCHAR2(25)  
LAST_NAME VARCHAR2(35)  
ADDRESS  VARCHAR2(50)  

문제는 where 문을 삽입 할 때마다라는 이름의 Cole Bee가 반환되어야한다고하더라도 no data found을 반환한다는 것입니다.where 문을 삭제하면 Cole Bee가 3 가지 주문을 내 보낸 것으로 나타납니다.

나는 no data found 결과를 얻지 못합니다. 어떤 아이디어?

답변

2

기본 검색어가 올해 필터링됩니다. having 절의 오른쪽에있는 하위 쿼리가 아닙니다. max(count())은 그 서브 쿼리를 독자적으로 실행하면 3이고, 필터링 된 목록과 비교하면 (기대 한대로) 해당 고객에 대해 2 행만 찾습니다.

실행 단지 having 부분 전체 쿼리 (오히려 where 절보다) 제거, 그냥 서브 쿼리를 을 실행; 결과를 비교하십시오. 심지어

WHERE TO_CHAR(order_date, 'YYYY') = '2017' 

나 :

SELECT f_customers.first_name, 
     f_customers.last_name, 
     count(order_total) 
FROM f_orders JOIN f_customers 
ON f_customers.id = f_orders.CUST_ID 
WHERE TO_CHAR(order_date, 'DD-Mon-YYYY') LIKE '%2017' 
GROUP BY f_customers.first_name, f_customers.last_name 
HAVING count(order_total) = (SELECT max(count(cust_id)) 
          FROM f_orders 
          WHERE TO_CHAR(order_date, 'DD-Mon-YYYY') LIKE '%2017' 
          GROUP BY cust_id) 

두 필터는 다음과 같이 더 간단하게 작성할 수 있습니다 :

간단한 대답은 필터를 반복하는 것입니다

WHERE EXTRACT(YEAR FROM order_date) = 2017 
당신은 타격 피할 수

분석 쿼리와 다른 트릭을 사용하여 테이블을 두 번 반복하지만이 작업이 당신이 가르쳐 왔던 것 이상으로 알고/사용할 것으로 예상됩니다.

+0

작동합니다. 대단히 감사합니다 !!! – Adi