我有以下表格
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
结果。有什么想法吗?
答案 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
你可以避免使用分析查询和其他技巧两次击败表格,但因为这似乎是一项可能超出你所教授和预期知道/使用的任务。