选择最小值,得到无效的关系运算符
Selecting minimum value, getting Invalid relational operator
我在使用基本 SQL 查询时遇到问题。将 MIN 函数与联接一起使用时会发生这种情况。
我想做的是 select 订单最少的客户,同时也显示那里的详细信息。
出现的错误是来自以下函数的无效运算符:
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 |
+-------+------------+
应该只有 return 一个用户以他们的名字作为销售价格。
我也试过了
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)
,它 return 就是所有用户和所有订单的列表。我假设有 min 只会给我留下一个最小的订单为什么会出错?
更新
我已经包含了评论建议的解决方案,但这 return 是每个用户的最小订单,我想要所有用户的最小订单,应该只有 return 一个客户。
您可以这样做:
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)
您可以使用解析 (window) 函数而不是聚合来执行此操作:
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;
这将return所有位客户以最低订单销售价;如果您只想要一位顾客,请使用 ROW_NUMBER()
而不是 RANK()
。
我在使用基本 SQL 查询时遇到问题。将 MIN 函数与联接一起使用时会发生这种情况。
我想做的是 select 订单最少的客户,同时也显示那里的详细信息。
出现的错误是来自以下函数的无效运算符:
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 |
+-------+------------+
应该只有 return 一个用户以他们的名字作为销售价格。
我也试过了
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)
,它 return 就是所有用户和所有订单的列表。我假设有 min 只会给我留下一个最小的订单为什么会出错?
更新
我已经包含了评论建议的解决方案,但这 return 是每个用户的最小订单,我想要所有用户的最小订单,应该只有 return 一个客户。
您可以这样做:
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)
您可以使用解析 (window) 函数而不是聚合来执行此操作:
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;
这将return所有位客户以最低订单销售价;如果您只想要一位顾客,请使用 ROW_NUMBER()
而不是 RANK()
。