请注意:我的 Access 副本是荷兰语,因此任何英文部分都是从荷兰语翻译而来的。
我目前正在使用 SQL 在 Access 中处理数据库,练习是:
创建一个查询,列出所有罚款超过 25 欧元的学生。
我创建了这个查询:
SELECT L.LLNR, U.LLNR, L.VOORNAAM, L.TUSSENVOEGSEL, L.ACHTERNAAM, SUM(U.BOETE)
FROM
LEERLINGEN L
INNER JOIN UITLENINGEN U ON L.LLNR = U.LLNR
WHERE (((U.BOETE)>25));
Run Code Online (Sandbox Code Playgroud)
当我单击时Execute,出现以下错误(从荷兰语翻译)
您正在尝试执行一个查询,其中所选表达式 LLNR 不是统计函数的一部分。
我该怎么办?
翻译: | Leerlingen = 学生 | Boete = 点球 |
当你有一个聚合函数时,你需要一个GROUP BY
语句。在你的情况下,这将是
SELECT
LEERLINGEN.LLNR,
UITLENINGEN.LLNR,
LEERLINGEN.VOORNAAM,
LEERLINGEN.TUSSENVOEGSEL,
LEERLINGEN.ACHTERNAAM,
SUM(UITLENINGEN.BOETE)
FROM
LEERLINGEN
INNER JOIN UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
WHERE
(((UITLENINGEN.BOETE)>25))
GROUP BY
LEERLINGEN.LLNR,
UITLENINGEN.LLNR,
LEERLINGEN.VOORNAAM,
LEERLINGEN.TUSSENVOEGSEL,
LEERLINGEN.ACHTERNAAM;
Run Code Online (Sandbox Code Playgroud)
GROUP BY 子句在 WHERE 子句之后但在 SELECT 语句的 ORDER BY(或 HAVING)子句之前。在这种情况下,您希望获得其他列的每个组合的“Boete”总和,因此需要按所有其他行进行分组。
简而言之,如果您有一个聚合函数(如 SUM、AVG、MIN 或 MAX),您需要告诉数据库引擎如何处理这些非聚合列。这是解释 GROUP BY 在那里为您做什么的一种简单方式。
顺便说一下,如果你想找出所有 Uitleningen.Boete 的总和大于 25 的情况(而不是只包括 Uitleningen.Boete 大于 25 的记录),你实际上必须使用 HAVING 子句。然后它看起来像这样:
SELECT
LEERLINGEN.LLNR,
UITLENINGEN.LLNR,
LEERLINGEN.VOORNAAM,
LEERLINGEN.TUSSENVOEGSEL,
LEERLINGEN.ACHTERNAAM,
SUM(UITLENINGEN.BOETE)
FROM
LEERLINGEN
INNER JOIN UITLENINGEN ON LEERLINGEN.LLNR = UITLENINGEN.LLNR
GROUP BY
LEERLINGEN.LLNR,
UITLENINGEN.LLNR,
LEERLINGEN.VOORNAAM,
LEERLINGEN.TUSSENVOEGSEL,
LEERLINGEN.ACHTERNAAM
HAVING
SUM(UITLENINGEN.BOETE)>25;
Run Code Online (Sandbox Code Playgroud)
将 HAVING 视为您团体的场所。使用 WHERE过滤行,使用 HAVING过滤组。