Krich
Krich

Reputation: 13

Access text count in query design

I am new to Access and am trying to develop a query that will allow me to count the number of occurrences of one word in each field from a table with 15 fields.

The table simply stores test results for employees. There is one table that stores the employee identification - id, name, etc.

The second table has 15 fields - A1 through A15 with the words correct or incorrect in each field. I need the total number of incorrect occurrences for each field, not for the entire table.

Is there an answer through Query Design, or is code required?

The solution, whether Query Design, or code, would be greatly appreciated!

Upvotes: 1

Views: 649

Answers (1)

Lee Mac
Lee Mac

Reputation: 16015

Firstly, one of the reasons that you are struggling to obtain the desired result for what should be a relatively straightforward request is because your data does not follow database normalisation rules, and consequently, you are working against the natural operation of a RDBMS when querying your data.

From your description, I assume that the fields A1 through A15 are answers to questions on a test.

By representing these as separate fields within your database, aside from the inherent difficulty in querying the resulting data (as you have discovered), if ever you wanted to add or remove a question to/from the test, you would be forced to restructure your entire database!

Instead, I would suggest structuring your table in the following way:

Results

+------------+------------+-----------+
| EmployeeID | QuestionID |  Result   |
+------------+------------+-----------+
|          1 |          1 | correct   |
|          1 |          2 | incorrect |
|        ... |        ... | ...       |
|          1 |         15 | correct   |
|          2 |          1 | correct   |
|          2 |          2 | correct   |
|        ... |        ... | ...       |
+------------+------------+-----------+

This table would be a junction table (a.k.a. linking / cross-reference table) in your database, supporting a many-to-many relationship between the tables Employees & Questions, which might look like the following:

Employees

+--------+-----------+-----------+------------+------------+-----+
| Emp_ID | Emp_FName | Emp_LName |  Emp_DOB   | Emp_Gender | ... |
+--------+-----------+-----------+------------+------------+-----+
|      1 | Joe       | Bloggs    | 01/01/1969 | M          | ... |
|    ... | ...       | ...       | ...        | ...        | ... |
+--------+-----------+-----------+------------+------------+-----+

Questions

+-------+------------------------------------------------------------+--------+
| Qu_ID |                          Qu_Desc                           | Qu_Ans |
+-------+------------------------------------------------------------+--------+
|     1 | What is the meaning of life, the universe, and everything? |     42 |
|   ... | ...                                                        |    ... |
+-------+------------------------------------------------------------+--------+

With this structure, if ever you wish to add or remove a question from the test, you can simply add or remove a record from the table without needing to restructure your database or rewrite any of the queries, forms, or reports which depends upon the existing structure.

Furthermore, since the result of an answer is likely to be a binary correct or incorrect, then this would be better (and far more efficiently) represented using a Boolean True/False data type, e.g.:

Results

+------------+------------+--------+
| EmployeeID | QuestionID | Result |
+------------+------------+--------+
|          1 |          1 | True   |
|          1 |          2 | False  |
|        ... |        ... | ...    |
|          1 |         15 | True   |
|          2 |          1 | True   |
|          2 |          2 | True   |
|        ... |        ... | ...    |
+------------+------------+--------+

Not only does this consume less memory in your database, but this may be indexed far more efficiently (yielding faster queries), and removes all ambiguity and potential for error surrounding typos & case sensitivity.

With this new structure, if you wanted to see the number of correct answers for each employee, the query can be something as simple as:

select results.employeeid, count(*)
from results
where results.result = true
group by results.employeeid

Alternatively, if you wanted to view the number of employees answering each question correctly (for example, to understand which questions most employees got wrong), you might use something like:

select results.questionid, count(*)
from results
where results.result = true
group by results.questionid

The above are obviously very basic example queries, and you would likely want to join the Results table to an Employees table and a Questions table to obtain richer information about the results.


Contrast the above with your current database structure -

Per your original question:

The second table has 15 fields - A1 through A15 with the words correct or incorrect in each field. I need the total number of incorrect occurrences for each field, not for the entire table.

Assuming that you want to view the number of incorrect answers by employee, you are forced to use an incredibly messy query such as the following:

select 
    employeeid,
    iif(A1='incorrect',1,0)+
    iif(A2='incorrect',1,0)+
    iif(A3='incorrect',1,0)+
    iif(A4='incorrect',1,0)+
    iif(A5='incorrect',1,0)+
    iif(A6='incorrect',1,0)+
    iif(A7='incorrect',1,0)+
    iif(A8='incorrect',1,0)+
    iif(A9='incorrect',1,0)+
    iif(A10='incorrect',1,0)+
    iif(A11='incorrect',1,0)+
    iif(A12='incorrect',1,0)+
    iif(A13='incorrect',1,0)+
    iif(A14='incorrect',1,0)+
    iif(A15='incorrect',1,0) as IncorrectAnswers
from
    YourTable

Here, notice that the answer numbers are also hard-coded into the query, meaning that if you decide to add a new question or remove an existing question, not only would you need to restructure your entire database, but queries such as the above would also need to be rewritten.

Upvotes: 2

Related Questions