#sql #sql-server #tsql #sql-server-2008 #stored-procedures
#sql #sql-сервер #tsql #sql-server-2008 #хранимые процедуры
Вопрос:
Я должен сделать следующее: выбрать преподавателей из существующей таблицы, случайным образом назначить им 1 из 4 опросов и ввести преподавателей и назначенный опрос в существующую таблицу (TeacherID, SurveyID), и, наконец, случайным образом выбрать 5 их учеников и записать это в другую существующую таблицу (StudentID и TeacherID).
В качестве отдельных задач это было бы легко … ошибаюсь, проще.
Не делая этого раньше, я пытаюсь определить наилучший процесс. Создайте временную таблицу, чтобы сначала сохранить учителей, а затем каким-то образом выполнить цикл (я никогда не делал этого в хранимой процедуре), чтобы случайным образом назначать опросы, а затем вставлять в таблицу опроса? Создать другую временную таблицу для случайного выбора учеников преподавателя, а затем назначить ее в таблицу учащихся опроса?
В ответ на вопрос rsbarro ниже: Есть три таблицы. В одном из них записывается имя опроса и автоматически увеличивается поле идентификатора. У другого есть TeacherID и присвоенный SurveyID. Последний содержит StudentID, TeacherID, а остальные столбцы предназначены для записи ответов (Q1, Q2, Q3 и т.д.). Идентификатор опроса не записан в таблице учитель-ученик. Это веб-приложение ранее выполнялось путем импорта данных либо из файла Excel, либо из базы данных Access, которая использовала макрос для назначения опросов и учащихся.
Спасибо,
Джеймс
Комментарии:
1. Есть ли в «другой» существующей таблице также столбец SurveyID? Без этого вы не сможете определить, какие учащиеся назначены какому преподавателю для какого опроса. Что вы уже пробовали?
Ответ №1:
Предполагая, что по крайней мере SQL Server 2005:
/* Assign 1 random survey to each teacher */
INSERT INTO TeacherSurvey
(teacherID, surveyID)
SELECT teacherID, (SELECT TOP 1 surveyID FROM Survey ORDER BY NEWID())
FROM Teacher
/* Randomly choose 5 students for each teacher */
INSERT INTO TeacherStudentSurvey
(teacherID, studentID)
SELECT teacherID, studentID
FROM (SELECT teacherID, studentID,
ROW_NUMBER() OVER(PARTITION BY teacherID ORDER BY NEWID()) AS RowNum
FROM TeacherStudent) t
WHERE t.RowNum <= 5
Комментарии:
1. Итак, мне только что сказали, что опрос назначается в последовательном порядке (1,2,3,4). Как это изменит код? Спасибо, Джеймс
Ответ №2:
Я не совсем понимаю, чего вы хотите от студентов, поэтому вот некоторый код, который позаботится о первой части. Случайное назначение опроса преподавателю. Возможно, вы можете использовать это, чтобы выяснить, как вам следует решить то, что осталось.
-- Table with instructors
declare @Teacher table(TeacherID int, Name varchar(15))
insert into @Teacher values (1, 'Instructor 1')
insert into @Teacher values (2, 'Instructor 2')
insert into @Teacher values (3, 'Instructor 3')
insert into @Teacher values (4, 'Instructor 4')
insert into @Teacher values (5, 'Instructor 5')
-- Table with the four surveys
declare @Survey table(SurveyID int, SurveyName varchar(15))
insert into @Survey values (1, 'Survey 1')
insert into @Survey values (2, 'Survey 2')
insert into @Survey values (3, 'Survey 3')
insert into @Survey values (4, 'Survey 4')
-- Target table for Teacher and randomly selected Survey
declare @TeacherSurvey table(TeacherID int, SurveyID int)
insert into @TeacherSurvey (TeacherID, SurveyID)
select
T.TeacherID,
(select top 1 SurveyID
from @Survey
order by newid()) as SurveyID
from @Teacher as T
Строки в @TeacherSurvey
TeacherID SurveyID
----------- -----------
1 2
2 2
3 4
4 4
5 3
Комментарии:
1. Спасибо за код. Как мне сказали, опрос имеет отношение к зачислению студентов в программу. Я считаю, что опрос имеет отношение к успеваемости учащихся и к тому, какую пользу приносит им программа.