Доступ к подсчету текста в дизайне запроса

Я новичок в Access и пытаюсь разработать запрос, который позволит мне подсчитать количество вхождений одного слова в каждом поле из таблицы с 15 полями.

В таблице просто хранятся результаты тестирования сотрудников. Есть одна таблица, в которой хранится идентификация сотрудника — id, имя и т. д.

Вторая таблица имеет 15 полей — от A1 до A15 со словами correct или incorrect в каждом поле. Мне нужно общее количество incorrect вхождений для каждого поля, а не для всей таблицы.

Есть ли ответ через Query Design или требуется код?

Решение, будь то Query Design или код, будет очень признательно!


person Krich    schedule 20.12.2019    source источник


Ответы (1)


Во-первых, одна из причин, по которой вы изо всех сил пытаетесь получить желаемый результат для того, что должно быть относительно простым запросом, заключается в том, что ваши данные не соответствуют правила нормализации базы данных, и, следовательно, вы работаете против естественной работы СУБД при запросе ваших данных.

Из вашего описания я предполагаю, что поля с A1 по A15 являются ответами на вопросы теста.

Представляя их как отдельные поля в вашей базе данных, помимо присущей трудности с запросом полученных данных (как вы обнаружили), если вы когда-либо хотели добавить или удалить вопрос в/из теста, вы были бы вынуждены реструктурировать всю вашу базу данных!

Вместо этого я бы предложил структурировать вашу таблицу следующим образом:

Результаты

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

Эта таблица будет соединительной таблицей (она же таблица ссылок/перекрестных ссылок) в вашей базе данных, поддерживает отношение "многие ко многим" между таблицами Employees и Questions, которое может выглядеть следующим образом:

Сотрудники

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

Вопросы

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

С помощью этой структуры, если вы когда-нибудь захотите добавить или удалить вопрос из теста, вы можете просто добавить или удалить запись из таблицы без необходимости реструктуризации вашей базы данных или переписывания каких-либо запросов, форм или отчеты, которые зависят от существующей структуры.

Кроме того, поскольку результатом ответа, скорее всего, будет двоичное число correct или incorrect, его лучше (и гораздо эффективнее) представить с помощью логического типа данных True/False, например:

Результаты

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

Это не только потребляет меньше памяти в вашей базе данных, но и может быть проиндексировано гораздо эффективнее (выдавая более быстрые запросы), а также устраняет всю двусмысленность и вероятность ошибок, связанных с опечатками и чувствительностью к регистру.

С этой новой структурой, если вы хотите увидеть количество правильных ответов для каждого сотрудника, запрос может быть таким простым, как:

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

В качестве альтернативы, если вы хотите просмотреть количество сотрудников, правильно ответивших на каждый вопрос (например, чтобы понять, на какие вопросы большинство сотрудников ответили неправильно), вы можете использовать что-то вроде:

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

Очевидно, что приведенные выше примеры являются очень простыми примерами запросов, и вы, вероятно, захотите соединить таблицу Results с таблицей Employees и таблицей Questions, чтобы получить более подробную информацию о результатах.


Сравните приведенное выше с вашей текущей структурой базы данных -

По вашему первоначальному вопросу:

Вторая таблица имеет 15 полей — от A1 до A15 со словами correct или incorrect в каждом поле. Мне нужно общее количество неправильных вхождений для каждого поля, а не для всей таблицы.

Предполагая, что вы хотите просмотреть количество неправильных ответов по сотруднику, вы вынуждены использовать невероятно запутанный запрос, такой как следующий:

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

Здесь обратите внимание, что номера ответов также жестко закодированы в запросе, а это означает, что если вы решите добавить новый вопрос или удалить существующий вопрос, вам не только потребуется реструктурировать всю базу данных, но и запросы, подобные приведенным выше, будут тоже надо переписать.

person Lee Mac    schedule 21.12.2019
comment
Я номинирую это на ответ месяца в [ms-access]. :) - person Andre; 21.12.2019
comment
Ли, большое спасибо! Я надеялся на ответ; вы дали урок! - person Krich; 23.12.2019