2015-11-08 91 views
0

我有一个表,看起来像这样:组函数嵌套太深SQL错误

+-----------------+--------------+ 
| Field   | Type   | 
+-----------------+--------------+ 
| orderNumber (PK)| int   | 
| orderDate  | date   | 
| requiredDate | date   | 
| shippedDate  | date   | 
| status   | char(15)  | 
| comments  | char(200) | 
| customerNumber | int   | 
+-----------------+--------------+ 

我需要回到它有订单的最大数量为CustomerNumber。

我尝试以下命令:

SELECT customerNumber FROM ORDERS WHERE customerNumber IN (SELECT customerNumber FROM ORDERS HAVING MAX(COUNT(customerNumber)) GROUP BY customerNumber); 

我认为一个错误:组函数嵌套太深

回答

1

SQL Fiddle

的Oracle 11g R2架构设置

CREATE TABLE ORDERS (
    orderNumber  int PRIMARY KEY, 
    orderDate  date, 
    requiredDate date, 
    shippedDate  date, 
    status   char(15), 
    comments  char(200), 
    customerNumber int 
); 

INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (1, 1); 
INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (2, 1); 
INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (3, 2); 
INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (4, 2); 
INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (5, 3); 
INSERT INTO ORDERS (ORDERNUMBER, CUSTOMERNUMBER) VALUES (6, 4); 

查询1 - 如果你只想得到一个单一的客户

SELECT CUSTOMERNUMBER 
FROM (
    SELECT CUSTOMERNUMBER, 
     COUNT(ORDERNUMBER) AS num_orders 
    FROM ORDERS 
    GROUP BY CUSTOMERNUMBER 
    ORDER BY num_orders DESC 
) 
WHERE ROWNUM = 1 

Results

| CUSTOMERNUMBER | 
|----------------| 
|    1 | 

查询2 - 如果你想获得所有客户的订单数最高

SELECT CUSTOMERNUMBER 
FROM (
    SELECT CUSTOMERNUMBER, 
     RANK() OVER (ORDER BY NUM_ORDERS DESC) AS RNK 
    FROM (
    SELECT CUSTOMERNUMBER, 
      COUNT(ORDERNUMBER) AS num_orders 
    FROM ORDERS 
    GROUP BY CUSTOMERNUMBER 
    ORDER BY num_orders DESC 
) 
) 
WHERE RNK = 1 

Results

| CUSTOMERNUMBER | 
|----------------| 
|    1 | 
|    2 | 
+0

如果有多个等值的行,该怎么办? – user1692342

+0

@ user1692342该问题没有指定需要多行 - 但是,我已经更新了第二个解决方案,该解决方案将返回订单数量最高的多行(并且不需要任何自连接)。 – MT0

0

一种方法是使用cte S,你在哪里得到订单数在第一CTE,然后选择最大值做。最后加入他们,以获得最大订单的客户。

with ordercount as (select customernumber, count(distinct ordernumber) ordercount 
        from orders 
        group by customernumber) 
,maxorders as (select max(ordercount) maxcount from ordercount) 
select o.customernumber 
from ordercount o 
join maxorders m on m.maxcount = o.ordercount