2017-12-12 4 views
0

にご注文を顧客の姓と名を選択してI持って、次の表のOracle 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ステートメントを挿入するときはいつでも、01221661061745151505という名前のCole Beeを返さなければならないのに、no data foundを返します。whereステートメントを削除すると、Cole Beeが3件の注文を出したことが表示されます。

no data foundの結果が得られない理由がわかりません。何か案は?

答えて

2

あなたの主なクエリは年をフィルタリングしています。 having句の右側のサブクエリはそうではありません。サブクエリを単独で実行すると、max(count())は3になります。そのサブクエリを(期待どおり)その顧客の2行しか見つけられないフィルタリングされたリストと比較しています。

ランだけhaving部分と全体のクエリが(むしろwhere句より)除去し、ちょうどサブクエリをを実行します。結果を比較する。

簡単な答えは、フィルタを繰り返すことです。

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 TO_CHAR(order_date, 'YYYY') = '2017' 

かさえ:

WHERE EXTRACT(YEAR FROM order_date) = 2017 

あなたが打つ避けることができます分析クエリやその他のトリックを使用して2回テーブルを作成しますが、これは取得する可能性がある割り当てのようですあなたが教えられ、知っている/使用することが期待されるものを超えて。

+0

これは機能します。どうもありがとうございました!!! – Adi