好的,我对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));
答案 0 :(得分:6)
你可以用子查询来解决问题,但是正确的子查询是:
AND Rep IN (SELECT Rep
FROM Orders
GROUP BY Rep
HAVING count(*) > 1
)
为了给出一些关于为什么你的方法不起作用的直觉,请考虑Rep
是什么。这只是一个代码。因此,在代码上执行>
并不会引起太多兴趣。至少,无论它做什么都不太可能与订单数量有关。即使你真的,也真的想要它。
更简单的方法是完全放弃该条款,只需添加:
HAVING count(*) > 1
答案 1 :(得分:4)
我认为你需要的是HAVING
。 HAVING 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;