debugMinor
I get the error "You are attempting to execute a query in which the selected expression is no part of a statistical function." in MS Access 2010?
Viewed 0 times
expressionerrortheyouarequerypartfunctiongetattempting
Problem
Please note: my copy of Access is in Dutch, so any English parts are translated from Dutch.
I'm currently working on a database in Access using SQL, with the exercise being:
Create a query that will list all students who have more than €25 of penalty.
I created this query:
When I click Execute, I get the following error (translated from Dutch)
You are attempting to execute a query in which the selected expression LLNR is no part of a statistical function.
What should I do?
Translations: |
Leerlingen = students |
Boete = penalty |
I'm currently working on a database in Access using SQL, with the exercise being:
Create a query that will list all students who have more than €25 of penalty.
I created this query:
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));When I click Execute, I get the following error (translated from Dutch)
You are attempting to execute a query in which the selected expression LLNR is no part of a statistical function.
What should I do?
Translations: |
Leerlingen = students |
Boete = penalty |
Solution
When you have an aggregate function, you need a
The GROUP BY clause comes after a WHERE clause but before an ORDER BY (or HAVING) clause on a SELECT statement. In this case, you want to get the sum of "Boete" for each combination of your other columns, hence the need to group by all of those other rows.
In short, if you have an aggregate function (like SUM, AVG, MIN, or MAX), you'll need to tell the database engine what to do with those non-aggregated columns. That's a simplistic way of explaining what GROUP BY does for you there.
Incidentally, if you want to find out cases where the sum of all Uitleningen.Boete is greater than 25 (rather than only including the records in which Uitleningen.Boete is greater than to 25), you actually have to use the HAVING clause. Then it would look like this:
Think of HAVING as a WHERE for your groups. You filter rows using WHERE, and you filter groups using HAVING.
GROUP BY statement. In your case, it would beSELECT
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;The GROUP BY clause comes after a WHERE clause but before an ORDER BY (or HAVING) clause on a SELECT statement. In this case, you want to get the sum of "Boete" for each combination of your other columns, hence the need to group by all of those other rows.
In short, if you have an aggregate function (like SUM, AVG, MIN, or MAX), you'll need to tell the database engine what to do with those non-aggregated columns. That's a simplistic way of explaining what GROUP BY does for you there.
Incidentally, if you want to find out cases where the sum of all Uitleningen.Boete is greater than 25 (rather than only including the records in which Uitleningen.Boete is greater than to 25), you actually have to use the HAVING clause. Then it would look like this:
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;Think of HAVING as a WHERE for your groups. You filter rows using WHERE, and you filter groups using HAVING.
Code Snippets
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;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;Context
StackExchange Database Administrators Q#28618, answer score: 5
Revisions (0)
No revisions yet.