列出所有成员的名字、姓氏和贷款总额。会员名字按升序排列

问题描述 投票:0回答:1
SELECT 
    MemberFirstName, MemberLastName, COUNT(*) AS TotalBookOnLoan
FROM
    Member
JOIN 
    Loan ON Member.MemberID= Loan.MemberID
WHERE 
    LoanDate IS NOT NULL
GROUP BY 
    Member.MemberFirstName
ORDER BY 
    MemberFirstName ASC

为什么这个查询是错误的?

sql dml
1个回答
0
投票

我在您的查询中发现了三个主要缺陷:

  1. 首先,您仅按名字进行聚合,然后选择名字和姓氏。在大多数数据库上,这样的代码甚至无法运行。即使在可以容忍这种语法的数据库上,这种行为也可能不是您想要的。解决方法是按名字和姓氏进行聚合。

  2. 您正在使用

    COUNT(*)
    进行计数。但问题是,会员没有任何借阅书籍,会错误地显示为拥有一本借阅书籍。要解决此问题,您应该使用
    COUNT(Loan.MemberId)
    进行计数。如果会员没有借阅书籍,则此计数表达式将正确返回零。

  3. 内连接应更改为左连接,贷款日期条件是连接条件的一部分。

将所有这些修复放入,我们可以尝试编写:

SELECT m.MemberFirstName, m.MemberLastName, COUNT(l.MemberID) AS TotalBookOnLoan
FROM Member m
LEFT JOIN Loan l
    ON m.MemberID = l.MemberID AND
       l.LoanDate IS NOT NULL
GROUP BY m.MemberFirstName, m.MemberLastName
ORDER BY m.MemberLastName, m.MemberFirstName;
© www.soinside.com 2019 - 2024. All rights reserved.