Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Результирующая таблица из множества таблиц 
V
    Опции темы
swetik1981
Дата 5.3.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.12.2007

Репутация: нет
Всего: нет



Имеется таблица с исчерпывающим перечнем всех студентов:

Код

allStudents

id    FIO     

1     Сидоров
...
48    Петров
...
97    Иванов 


Имеется совокупность одинаковых по структуре таблиц с результатами тестирования студентов (каждому тестированию соответствует одна таблица). Очень упрощённо структура таблицы такая:

Код

Table1

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,
...


У меня в результате получается такая результирующая таблица:

Код

FIO      isTest1   isTest2    ....

Сидоров  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. Что же тут можно придумать?




PM MAIL   Вверх
Akina
Дата 5.3.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(swetik1981 @  5.3.2011,  20:29 Найти цитируемый пост)
Первая мысль, которая приходит в голову
Нет, первая и единственная мысль - выбросить этот бред 
Цитата(swetik1981 @  5.3.2011,  20:29 Найти цитируемый пост)
Имеется совокупность одинаковых по структуре таблиц с результатами тестирования студентов 
и делать заново.





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
swetik1981
Дата 7.3.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.12.2007

Репутация: нет
Всего: нет



Цитата(swetik1981 @  5.3.2011,  20:29 Найти цитируемый пост)
Первая мысль, которая приходит в голову
Нет, первая и единственная мысль - выбросить этот бред 
Цитата(swetik1981 @  5.3.2011,  20:29 Найти цитируемый пост)
Имеется совокупность одинаковых по структуре таблиц с результатами тестирования студентов 
и делать заново.

А вот и бредовое решение, позволяющее ничего не делать заново:
Код

TRANSFORM First(T.isTest) 
SELECT First(A.FIO) as фио, SUM(T.isTest) as всего
FROM allStudents A LEFT JOIN
(
 SELECT "тест1" as test, id, 1 AS isTest FROM Table1 UNION
 SELECT "тест2" as test, id, 1 AS isTest FROM Table2 UNION
 ...
 SELECT "тестN" as test, id, 1 AS isTest FROM TableN
) T ON A.id=T.id
GROUP BY A.id
PIVOT T.test


Проблема решена..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.