|
Вопрос # 6 539/ вопрос решён / |
|
Здравствуйте!
Сейчас работаю над экспертной системой в Delphi.
Вот тут в вопросе подробнее:
https://expert.delphi-int.ru/question/6531/
Столкнулась с проблемой при вычислении результата
Есть таблица с правильными ответами (как нужно ответить на вопрос, чтобы получить данный результат):
результат - вопрос1- вопрос2 - и т.д.
1 - 1 - 2 -
2 - 3 - 1 -
И есть таблица с вариантами ответов пользователя:
вопрос - ответ
1 - 1
2 - 3
и т.д.
Еще есть таблица с коэффициентами вопроса:
вопрос - коэффициент
1 - 40
2 - 10
и т.д.
Скажите, пожалуйста, возможно ли реализовать сравнение ответов пользователя с каждой строчкой из первой таблицы, и если они совпали, то коэффициенты сложить и в итоге вывести каждый результат с суммарным итогом коэффициентов, т.е.:
результат 1 : ответ пользователя 1 и он совпал с ответом для результата, значит коэффициент 40
на второй вопрос пользователь ответил - 3, а ответ для результата - 2, не совпало, значит коэффициент 0
суммарный коэффициент для результата 1 = 40 + 0 = 40
Тоже самое для всех остальных результатов и итоги записать, к примеру в другую таблицу, где они отсортируются по суммарному коэффициенту.
Подскажите, пожалуйста, это вообще реально сделать? Или может есть какой-то более легкий путь?
 |
Вопрос задала: Цирцея (статус: Посетитель)
Вопрос отправлен: 5 июня 2014, 20:56
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: ANBsoft
Здравствуйте, Цирцея!
Сложно обрабатывать столбцы стандартными средставми SQL
Если изменить первую таблицу примерно так:
"Результат" "Номер вопроса" "Правильный ответ"
Лада 1 2
Лада 2 1
БМВ 1 1
БМВ 2 2
В таком случае можно будет вычислить число набранных каждым результатом баллов:
SELECT P."Результат", SUM(K."Коэффициент")
FROM Otvet O, PravilniyOtvet P, Koefficient K
WHERE (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ") and (P."Номер вопроса"=K."Номер вопроса")
GROUP BY P."Результат"
или вывести список подходящих критерием по каждому результату:
SELECT O."Номер вопроса", P."Результат", K."Коэффициент"
LEFT JOIN PravilniyOtvet P ON (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ")
LEFT JOIN Koefficient K ON (O."Номер вопроса"=K."Номер вопроса")
Если все же хотите хранить в столбцах, то прийдется писать View-ы, хранимые процедуры, макросы или что-то еще в зависимости от конкретной базы данных.
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 5 июня 2014, 22:36
Оценка за ответ: 5
Комментарий к оценке: Спасибо огромное, очень выручили
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 5 июня 2014, 23:01; участников в обсуждении: 2.
|
ANBsoft (статус: Студент), 5 июня 2014, 21:47 [#1]:
Более понятно описывайте таблицы.
В первой таблице непонятно что и как хранится.
Что такое результат?
К примеру вторая таблица:
"Номер вопроса" "Ответ"
1 1
2 3
К третяя таблица:
"Номер вопроса" "Коэффициент"
1 40
2 10
|
|
ANBsoft (статус: Студент), 5 июня 2014, 22:05 [#2]:
Логичнее будет хранить правильные ответы в отдельных строках, тогда можно будет все вычислять простым запросом, если же правильные ответы будут в столбцах, то получатся многоэтажные запросы, зависящие от количества вопросов в тесте
|
|
Цирцея (статус: Посетитель), 5 июня 2014, 22:07 [#3]:
К примеру, экспертная система по выбору машины, возьмем условно:
Вопрос 1: Что вы цените в машине?
1. Безопасность
2. Комфорт
Вопрос 2: Сколько подушек безопасности должно быть:
1. две
2. четыре
Таблица с правильными ответами:
результат - вопрос1- вопрос2 - и т.д.
Лада - 2 - 1
БМВ - 1 - 2
т.е., чтобы получить "БМВ" , пользователю на первый вопрос нужно ответить 1, а на второй - 2
И есть таблица с вариантами ответов пользователя:
вопрос - ответ
вопрос1 - 1
вопрос2 - 1
и т.д.
т.е. на первый вопрос он ответил 1, на второй тоже 1
Таблица с коэффициентами вопроса:
вопрос - коэффициент
1 - 40
2 - 10
и т.д.
коэффициенты нужны, чтобы обозначить "важность" вопроса, т.е. в данном случае вопрос 1 важнее, чем вопрос 2
Это сделано для того чтобы, вопросы важные вопросы, например, как первый(Что вы цените в машине?) не был равноценен вопросу, например о цвете машины
еще есть таблицы, которые хранят сами вопросы и сами ответы, но здесь они не нужны
вроде более понятно описала
Самый страшный вирус всегда сидит перед компьютером.
|
|
Цирцея (статус: Посетитель), 5 июня 2014, 22:14 [#4]:
ANBsoft, правильные ответы в строках хранятся, а ответы пользователя лучше переделать вот так:
вопрос1 - вопрос2 - и т.д.
1 - 1
я правильно Вас поняла?
Самый страшный вирус всегда сидит перед компьютером.
|
|
Цирцея (статус: Посетитель), 5 июня 2014, 22:46 [#5]:
ANBsoft, спасибо за ответ
а если считать проценты вот тут:
SELECT P."Результат", SUM(K."Коэффициент")
FROM Otvet O, PravilniyOtvet P, Koefficient K
WHERE (O."Номер вопроса"=P."Номер вопроса") and (O."Ответ"=P."Правильный ответ") and (P."Номер вопроса"=K."Номер вопроса")
GROUP BY P."Результат"
то вместо SUM(K."Коэффициент") можно написать:
SUM AS (SUM(K."Коэффициент")*100/Х)
где, Х - максимальный коэффициент (посчитать его до этого запроса)
можно ведь так сделать?
Самый страшный вирус всегда сидит перед компьютером.
|
|
ANBsoft (статус: Студент), 5 июня 2014, 22:53 [#6]:
SELECT P."Результат", SUM(K."Коэффициент"*100/X)-если X известен заранее
или
SELECT P."Результат", SUM(K."Коэффициент"*100/(SELECT SUM("Коэффициент") FROM Koefficient))
если неизвестен или коэффициенты могут меняться
|
|
Цирцея (статус: Посетитель), 5 июня 2014, 23:01 [#7]:
Ой, точно. Спасибо огромное.
Я сейчас буду делать тогда.
Завтра отпишусь, получилось или нет.
Вы сможете зайти и посмотреть, на случай, если вдруг что-то не получится? Это очень важно для меня.
Спасибо.
Самый страшный вирус всегда сидит перед компьютером.
|
6 июня 2014, 18:24: Статус вопроса изменён на решённый (изменил автор вопроса — Цирцея)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|