Oracle sql选择2017年订单最多的客户的名字和姓氏

时间:2017-12-12 22:38:19

标签: oracle oracle-sqldeveloper

我有以下表格

f_orders

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

包含以下数据

  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

f_customers

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

包含以下数据

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

我应该在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)

问题在于每当我插入where语句时它返回no data found,即使它应该返回名称Cole Bee的2个命令 如果我删除where语句,它将显示Cole Bee已经下了3个订单

我无法弄清楚为什么会得到no data found结果。有什么想法吗?

1 个答案:

答案 0 :(得分: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

你可以避免使用分析查询和其他技巧两次击败表格,但因为这似乎是一项可能超出你所教授和预期知道/使用的任务。