Хранимая процедура SQL Server для случайного назначения опроса

#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. Спасибо за код. Как мне сказали, опрос имеет отношение к зачислению студентов в программу. Я считаю, что опрос имеет отношение к успеваемости учащихся и к тому, какую пользу приносит им программа.