试图显示前 2 个平均价格

Attempting to display top 2 average prices

我正在尝试显示前 2 个平均价格,但是我遇到了一个问题,因为我需要显示的两列来自不同的表,并且当我尝试从其他线程解决方案时,连接给我错误消息。例如:

Customer Table          Order Table
CID,CNAME               OID,CID,OPRICE    
1,  JOHN                 1,  1,  2.50
2,  JEFF                 2,  1,  3.40
3,  ROB                  3,  2,  4.20
                         4,  3,  3.50

这是我目前得到的结果,但它显示了所有结果,而不仅仅是前 2 个。

SELECT CNAME,AVG(OPRICE)
FROM CUSTOMER, ORDER
WHERE CUSTOMER.CID=ORDER.CID
GROUP BY CNAME;

我想要的结果是:

CNAME,AVG(OPRICE)
JEFF,  4.20
ROB,   3.50

首先,学习正确的 join 语法。 从不FROM 子句中使用逗号。 始终 使用 JOINON

那么,在 Oracle 12C+ 中,您可以:

SELECT c.CNAME, AVG(o.OPRICE)
FROM CUSTOMER c JOIN
     ORDER o
     ON c.CID = o.CID
GROUP BY c.CNAME
ORDER BY AVG(o.OPRICE) DESC
FETCH FIRST 2 ROWS ONLY;

早期版本需要子查询:

SELECT CNAME, avg_oprice
FROM (SELECT c.CNAME, AVG(o.OPRICE) as avg_oprice
      FROM CUSTOMER c JOIN
           ORDER o
           ON c.CID = o.CID
      GROUP BY c.CNAME
      ORDER BY AVG(o.OPRICE) DESC
     ) c
WHERE rownum <= 2;

更新的 Oracle 版本有 FETCH FIRST:

SELECT CNAME,AVG(OPRICE) as AVGPRICE
FROM CUSTOMER, ORDER
WHERE CUSTOMER.CID=ORDER.CID
GROUP BY CNAME
ORDER BY AVGPRICE DESC
FETCH FIRST 2 ROWS ONLY