检查每行表中包含多少列的值

时间:2013-10-01 15:21:28

标签: c# sql sql-server database

我在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名学生团体所需的最低人数。所以,我想在“Groups table”中插入并检索该号码并在每个学生的“Group ID”列中插入。 如果学生输入少于4个偏好,我将不得不创建一个新的“组ID”并分配给学生,但我还必须检查每组5-8名学生是否违反。

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

1 个答案:

答案 0 :(得分:3)

这是一个非常糟糕的桌面设计。使用多个表可能会好多了。一个用于学生/小组,一个用于学生/偏好。所以:

T_STUDENTS
StudentID
GroupID

T_STUDENT_PREFERENCES
StudentID
Preference

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

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

由于你不能这样做,你必须对案例陈述做一些粗略的事情。

这样的东西
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列添加并过滤所需的首选项数量。