SQL省略只出现一次的行

时间:2014-02-28 17:37:52

标签: sql oracle

好的,我对SQL很新,所以这就是问题:

对于已接受订单的每个salesrep,列出所有订单的最小,最大和平均订单金额。仅包括1990 - 1999年间任何时候发出的订单。 从列表中省略任何仅在此时间范围内生成1个订单的salesrep。按Salesrep编号对结果进行排序。

我把它归结为:

SELECT Rep
      ,MIN(Amount) AS "MinAmount"
      ,MAX(Amount) AS "MaxAmount"
      ,AVG(Amount) AS "AverageAmount"
FROM Orders
WHERE Orderdate BETWEEN '1990-01-01' AND '1999-12-31'
GROUP BY Rep;

我以为anwser是:

AND Rep > ( SELECT COUNT(Distinct Rep)
              FROM Orders)

但它似乎不起作用。任何帮助都很感激!

最后订单包含:

CREATE TABLE Orders
(OrderNum    NUMBER(10)      NOT NULL,
 OrderDate   DATE            NOT NULL,
 Cust        NUMBER(10),
 Rep         NUMBER(10),
 Mfr         CHAR(3)         NOT NULL,
 Product     CHAR(5)         NOT NULL,
 Qty         NUMBER(5)       NOT NULL,
 Amount      NUMBER(9,2)     NOT NULL,
 CONSTRAINT OrdersPK 
      PRIMARY KEY (OrderNum));

2 个答案:

答案 0 :(得分:6)

可以用子查询来解决问题,但是正确的子查询是:

AND Rep IN (SELECT Rep
            FROM Orders
            GROUP BY Rep
            HAVING count(*) > 1
           )

为了给出一些关于为什么你的方法不起作用的直觉,请考虑Rep是什么。这只是一个代码。因此,在代码上执行>并不会引起太多兴趣。至少,无论它做什么都不太可能与订单数量有关。即使你真的,也真的想要它。

更简单的方法是完全放弃该条款,只需添加:

HAVING count(*) > 1

答案 1 :(得分:4)

我认为你需要的是HAVINGHAVING COUNT(OrderNum) > 1会过滤掉在此期间内少于一个订单的所有Rep个。这里显示了一些examples of having子句。

SELECT Rep ,
    MIN(Amount) AS "MinAmount" ,
    MAX(Amount) AS "MaxAmount" ,
    AVG(Amount) AS "AverageAmount" 
FROM Orders 
WHERE Orderdate BETWEEN '1990-01-01' AND '1999-12-31'
GROUP BY Rep
HAVING COUNT(OrderNum) > 1;