我遇到基本SQL查询的问题。将MIN函数与连接一起使用时会发生这种情况。
我要做的是选择订单最少的客户,同时显示详细信息。
出现的错误是以下函数中的无效运算符:
SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE FROM (CUSTOMER INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR=CUSTOMER.CUST_NBR)HAVING MIN(CUST_ORDER.SALE_PRICE);
+----------+-------+-------+
| CUST_NBR | FNAME | LNAME |
+----------+-------+-------+
+-----------+----------+------------+
| ORDER_NUM | CUST_NUM | SALE_PRICE |
+-----------+----------+------------+
我要找的结果是:
+-------+------------+
| FNAME | SALE_PRICE |
+-------+------------+
哪个应该只返回单个用户,其名称为销售价格。
我也试过
HAVING SALE_PRICE = MIN(SALE_PRICE)
但是这会错误地抛出一组。我也尝试了一个group by子句:
SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE FROM (CUSTOMER INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR=CUSTOMER.CUST_NBR) GROUP BY FNAME HAVING MIN(CUST_ORDER.SALE_PRICE);
也给出了无效的操作错误。
有谁可以指出我做错了什么?
注意
如果我从原始查询中取出HAVING min(sale_price)
,它将返回所有用户和所有订单的列表。我假设有min会给我留下一个最小的顺序,为什么它会出错?
更新
我已经包含了评论建议的解决方案,但这会返回每个用户的最小订单,我希望所有用户中的最小订单只能返回一个客户。
答案 0 :(得分:1)
您可以执行以下操作:
SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE
FROM (SELECT CUSTOMER.FNAME,
CUST_ORDER.SALE_PRICE,
MIN (CUST_ORDER.SALE_PRICE) OVER () MIN_PRICE
FROM (CUSTOMER
INNER JOIN CUST_ORDER
ON CUST_ORDER.CUST_NBR = CUSTOMER.CUST_NBR))
WHERE CUST_ORDER.SALE_PRICE = MIN_PRICE
此外,您可以使用子查询获得最小值,然后请求它:
SELECT CUSTOMER.FNAME, CUST_ORDER.SALE_PRICE
FROM (CUSTOMER
INNER JOIN CUST_ORDER ON CUST_ORDER.CUST_NBR = CUSTOMER.CUST_NBR)
where CUST_ORDER.SALE_PRICE = (SELECT MIN(SALE_PRICE) FROM CUST_ORDER)
答案 1 :(得分:0)
您可以使用分析(窗口)函数而不是聚合来执行此操作:
SELECT fname, sale_price FROM (
SELECT c.fname, co.sale_price, RANK() OVER ( ORDER BY co.sale_price ) rn
FROM customer c INNER JOIN cust_order co
ON c.cust_nbr = co.cust_nbr
) WHERE rn = 1;
这将以最低订单销售价格返回所有客户;如果您只想要一个最小的客户,请使用ROW_NUMBER()
代替RANK()
。