我是SQL的新手,在设计数据库后,我遇到了一些问题。我目前正在与州讨论的问题: “订购了至少一个预期持续时间高于平均值的项目的客户列表。”
SELECT Customer.name
FROM Project, Customer
WHERE Project.c_id = Customer.c_id AND Project.exp_duration > AVG(Project.exp_duration)
我尝试实现此代码,但我不断收到以下错误消息:“聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且列中被聚合是一个外部参考。“ 有人可以帮我弄这个吗?我已经考虑过使用连接,但我也无法使用连接。 提前谢谢!
答案 0 :(得分:0)
将表变量(@Project& @Customer)替换为真实表(Project& Customer)。
DECLARE @Project TABLE
(
p_id INT,
exp_duration DECIMAL(18,2),
c_id INT
)
DECLARE @Customer TABLE
(
c_id INT,
name VARCHAR(20)
)
INSERT @Project VALUES (1, 10, 1), (2, 5, 1), (3, 20, 1), (4, 10, 2), (5, 15, 2), (6, 20, 1)
INSERT @Customer VALUES (1, 'C1'), (2, 'C2')
-- average duration
-- SELECT AVG(exp_duration) FROM @Project
SELECT DISTINCT C.name
FROM @Customer C INNER JOIN @Project P ON C.c_id = P.c_id
WHERE p.exp_duration > (SELECT AVG(exp_duration) FROM @Project)
答案 1 :(得分:0)
以下查询给出了订购了至少一个项目(即作为一个或多个项目的一部分)且其 ExpectedDuration 大于Average ExpectedDuration 的客户列表
我使用了左外连接,分组依据,计数和平均聚合函数。
Select
C.CustomerID,
C.Name
From SampleCustomer C
Left Join SampleProject P
On C.CustomerID = P.CustomerID
Where P.ExpectedDuration > (Select Avg(ExpectedDuration) From SampleProject Where CustomerID = C.CustomerID)
Group By C.CustomerID, C.Name
Having Count(P.ProjectID) >= 1
Order By C.CustomerID;