如何为此目的创建SQL重试?

时间:2014-05-31 19:52:31

标签: mysql sql

我正在使用这种关系模式为银行业创建一个数据库:

relational schema

我遇到了以下问题:

“提供与银行活动方面有关的SQL检索。包括多表连接,格式化和条件检索。”

因此,我试图提供一个SQL检索,在那里我可以找到平均帐户余额在10,000到15,000之间的客户名称和地址。虽然我有限的知识阻止我这样做。我正在尝试准备一份包含以下两个特征的声明: 1.有多表连接。 2.有条件重审。

到目前为止,我有:

SELECT EmployeeID, AccountID, AVG (AccountBalance)
FROM Employee, Account
GROUP BY EmployeeID
HAVING AVG (AccountBalance) BETWEEN
   (SELECT MAX(AVG(MIN AccountBalance))
    FROM Account ...

虽然我认为上述内容无效。

有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

听起来你正在做某种教程,所以我试着给你一些详细的帮助。让我们来看看你拥有的东西。这是您查询的第一部分:

SELECT EmployeeID, AccountID, AVG (AccountBalance)
FROM Employee, Account
GROUP BY EmployeeID

首先,如果您想查找客户名称,为什么要查询员工? 其次,FROM子句FROM Employee, Account将为您提供Employee和Account的所有行的组合,也就是Cross Join。但是我想你要把信息彼此联系起来。 所以你要做的是: 第1步:与客户交换员工

SELECT CustomerID, AccountID, AVG (AccountBalance)
FROM Customer, Account
GROUP BY CustomerID

步骤2:在客户和帐户之间创建一个JOIN,以将帐户与客户关联。

SELECT CustomerID, AccountID, AVG (AccountBalance)
FROM Customer c
    JOIN Account a ON a.CustomerID=c.CustomerID
GROUP BY CustomerID

如果您尝试执行此查询,则会遇到错误。这是因为您在GROUP BY子句中只有CustomerID,但您在SELECT子句中也有AccountID。根据您的架构,您可能拥有每个客户的多个帐户。因此GROUP BY CustomerID将为每个CustomerID提供一行。现在SQL Server无法知道他应该返回哪个AccountID(因为可能有几个)。这就是错误发生的原因。第三列,AVG(AccountBalance)不会抛出错误,因为它包含聚合函数。 AVG将计算与客户关联的所有帐户的平均AccountBalance,因此每个CustomerID也只返回一个值。所以你必须省略AccountID:

SELECT c.CustomerID, AVG (a.AccountBalance)
FROM Customer c
    JOIN Account a ON a.CustomerID=c.CustomerID
GROUP BY c.CustomerID

此查询将执行。您可能已经注意到我在表(a和c)中使用了别名,这使得更容易阅读代码,特别是如果它在不同的表中使用同样命名的列变得更复杂。

到目前为止,您拥有每位客户的所有客户帐户的平均余额。现在你必须应用条件" BETWEEN 10.000和15.000"结果。您尝试的内容已经是正确的路径 - 您必须将条件应用于GROUP结果,因此您必须使用HAVING子句。

SELECT c.CustomerID, AVG (a.AccountBalance)
FROM Customer c
    JOIN Account a ON a.CustomerID=c.CustomerID
GROUP BY c.CustomerID
HAVING AVG (a.AccountBalance) BETWEEN 10000 AND 15000

那就是它。请注意,BETWEEN包含边框,因此结果中将包含10000和15000的平均帐户余额。

您现在可以从customer表中添加其他列,但如果要在SELECT中使用它们,请确保将它们包含在GROUP BY子句中。