Страница: 1 |
Страница: 1 |
Вопрос: Результирующая таблица из множества таблиц
Добавлено: 05.03.11 19:32
Автор вопроса:
Zahar | Web-сайт:
Имеется таблица с исчерпывающим перечнем всех студентов:
allStudents
id FIO
1 Сидоров
...
48 Петров
...
97 Иванов
Имеется совокупность одинаковых по структуре таблиц с результатами тестирования студентов (каждому тестированию соответствует одна таблица). Очень упрощённо структура таблицы такая:
id FIO Rez
48 Петров 76
97 Иванов 72
167 Павлов 101
При этом в тесте принимают участие не все студенты из списка (кто-то болел, сачковал и т.д.), соответственно отсутствующих в таблтце просто не будет.
Мне необходимо вывести таблицу участия студентов в тестированиях за год и статистику (количество) тестов, в которых они учавствовали.
Для этого я создаю таблицу совпадений:
SELECT FIO, Q1.isTest1 AS isTest1, Q2.isTest2 AS isTest2, ... FROM
allStudents,
(SELECT id, 1 AS isTest FROM Table1) AS Q1,
(SELECT id, 1 AS isTest FROM Table2) AS Q2,
...
allStudents LEFT JOIN Q1 ON allStudents.id=Q1.id,
allStudents LEFT JOIN Q2 ON allStudents.id=Q2.id,
...
У меня в результате получается такая результирующая таблица:
Сидоров 1 1
...
Петров Null 1
...
Иванов Null Null
Единичка соответствует участию студента в тесте.
Нет проблем подсчитать через ADO-recordset и вывести в отдельную колонку количество сданных студентами тестов.
Но это очень долго при большом объёме таблиц и неудобно.
Нельзя ли это как-то сделать во время исполнения SQL-запроса?
Первая мысль, которая приходит в голову, это первую строку вышеуказанного запроса дополнить суммой полей:
SELECT FIO, Q1.isTest1 AS isTest1, Q2.isTest2 AS isTest2, ..., isTest1+isTest2+... AS Summa FROM ...Но если хотя бы одно из полей содержит Null сумма полей также будет Null. Что же тут можно придумать?
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа: Захарка
Вопросов: 0
Ответов: 42
Профиль | | #1
Добавлено: 05.03.11 19:40
а если null просто поменять на 0?
Номер ответа: 2
Автор ответа: Zahar
Вопросов: 91
Ответов: 67
Web-сайт:
Профиль | | #2
Добавлено: 05.03.11 23:45
Хорошая мысль!
А как это сделать?
Номер ответа: 3
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 06.03.11 00:59
Если речь идет о SQL Server, то есть функция ISNULL.
ISNULL(NULL, 20) вернет 20
ISNULL(10,20) вернет 10.
Т.е. если первый аргумент NULL, возвращаетяс второй, все просто.
Это прямо в запросе можно использовать.
Номер ответа: 4
Автор ответа: Zahar
Вопросов: 91
Ответов: 67
Web-сайт:
Профиль | | #4
Добавлено: 07.03.11 20:39
К сожалению, это Access