0

我在 MSSQL 数据库中有这两个表。

学生偏好表 (该表的偏好列在数据库中编号为 1-7)

 ------------------------------------------------------------------------------
    Student Name |   Preference 1|  Preference 2 | Preference 3  |Group ID
    -----------------------------------------------------------------------
    Student A    |   Student G   |   Student F   |  Student G    |
    Student B    |   Student H   |   Student K   |  Student L    |
    Student C    |   Student I   |   Student A
    Student D    |   Student H   |   Student K
    Student E
    Student F
    Student G
    Student H
    Student I
    Student J
    Student K
    Student L
    -----------------------------------------------------------------------------

组表

 |Group ID |
     ---------
    1
    2
    3
    ----------

我正在根据学生输入的偏好(首选合作伙伴/队友)创建学生组。每组可以有 5-8 名学生。并非所有学生都会输入偏好。要创建一个组,我将检查输入了 4-7 个偏好的学生并将他们添加到一个组中。例如,学生 A 输入了 4 个偏好。包括学生 A 现在我有 5 名学生最少需要组。所以,我想插入“组表”并检索该数字并插入每个学生的“组 ID”列。如果学生输入的偏好少于 4 个,我将不得不创建一个新的“组 id”并分配给学生,但我还必须检查每组 5-8 名学生是否违反条件。

有人可以指导我吗?如何检查超过 4 个首选项列包含数据(名称)的行?如果存在超过 4 个偏好的学生,那么我如何在组表(组 ID(auto-inc))中插入新记录并将其检索回以插入学生偏好表。在插入组 ID 之前,我如何检查 5-8 名学生的条件是否违反?我试图找出如何以最简单的方式解决这些问题(使用 c# 或 SQL)?我正在用 C# 编写应用程序。

4

1 回答 1

3

这是一个非常可怕的桌子设计。多张桌子可能会好得多。一个用于学生/团体,一个用于学生/偏好。所以:

T_STUDENTS
StudentID
GroupID

T_STUDENT_PREFERENCES
StudentID
Preference

然后你可以简单地查询你的偏好表:

select
studentid,
count(preference)
from
pref_table
group by
studentid
having count(preference) >4

既然你不能这样做,你将不得不对 case 语句做一些粗糙的事情。

就像是

select
student,
case when preference1 <>''  then 1 else 0 end as pref1 //or something to check for empty/null,
case when preference2 <>'' then 1 else 0 end as pref2
....

然后将 7 列相加并筛选出您想要的偏好数量。

于 2013-10-01T15:39:55.827 回答