我正在使用这种关系模式为银行业创建一个数据库:
我遇到了以下问题:
“提供与银行活动方面有关的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 ...
虽然我认为上述内容无效。
有任何帮助吗?
答案 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子句中。