2011-04-13 5 views
2

Je dois faire ce qui suit: Sélectionner les instructeurs d'une table existante, leur attribuer au hasard 1 des 4 sondages et entrer les instructeurs et l'enquête assignée dans une table existante (teacherID, surveyID), et enfin sélectionner aléatoirement 5 de leurs étudiants et les enregistrer dans une autre table existante (studentID et teacherID).Procédure stockée SQL Server pour l'assignation aléatoire

En tant que tâches distinctes, ce serait facile ... er, plus facile. Je n'ai pas fait cela avant d'essayer de trouver le meilleur processus. Créer une table temporaire pour d'abord stocker les enseignants et puis en quelque sorte en boucle (je n'ai jamais fait cela dans une procédure stockée) à travers cela pour assigner au hasard des enquêtes et ensuite insérer dans le tableau de l'enquête? Créer une autre table temporaire pour sélectionner au hasard les élèves de l'enseignant puis l'affecter dans la table des élèves de l'enquête?

En réponse à la question de rsbarro ci-dessous: Il y a trois tables. On enregistre le nom de l'enquête et a un champ id incrémenté automatiquement. Un autre a le teacherID et le surveyID assigné. Le dernier a le studentID, TeacherID et les colonnes restantes sont pour l'enregistrement des réponses (Q1, Q2, Q3, etc.). L'identifiant de l'enquête n'est pas enregistré dans la table enseignant-étudiant. Cette application Web a été précédemment effectuée en important des données à partir d'un fichier Excel ou d'une base de données Access utilisant une macro pour affecter les enquêtes et les étudiants.

Merci,

James

+0

Est-ce que "l'autre" table existante ont une colonne surveyID ainsi? Sans cela, vous ne serez pas en mesure de dire quels étudiants sont affectés à quel enseignant pour quelle enquête. Qu'avez-vous essayé jusqu'à présent? – rsbarro

Répondre

3

prendre au moins 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 
+0

Merci pour le code. La base de données est 2008. – James

+0

On m'a simplement dit que le sondage était assigné par ordre séquentiel (1,2,3,4). Comment cela changerait-il le code? Merci, James – James

1

Je ne comprends pas tout à fait ce que vous voulez avec les étudiants est donc ici un code qui se charge de la première partie. Attribuer aléatoirement un sondage à un enseignant. Peut-être que vous pouvez utiliser cela pour comprendre comment vous devriez résoudre ce qui reste.

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

lignes dans @TeacherSurvey

TeacherID SurveyID 
----------- ----------- 
1   2 
2   2 
3   4 
4   4 
5   3 
+0

Merci pour le code. Ce qu'on m'a dit, l'enquête a à voir avec l'inscription des étudiants dans un programme. Je crois que le sondage a trait au rendement des élèves et à la façon dont le programme leur profite. – James