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