一个复杂的SQL查询建议

时间:2012-12-18 16:19:50

标签: sql

我正在构建一个应用程序

我的SQL数据库中有一个Student表 这有以下结构

(
Student_ID int,
FullName varchar(255),
FirstName varchar(255),
LastName varchar(255),
FatherName varchar(255),
Father_FirstName varchar(255),
Father_LastName varchar(255),
Date_of_Birth datetime,
Gender varchar(10),
Date_of_Registration datetime,
Regestration_Status varchar(10),
Degree_Status varchar(10),
Qualification varchar(15),
Campus varchar(15),
Batch int,
Degree varchar(10)
)

此表中收集的数据来自4个不同的城市KARACHI,ISLAMABAD,PESHAWAR,KARACHI

从白沙瓦收集的学生数据没有设置性别属性,因此在整个表中,来自白沙瓦的学生的性别列不包含任何值。

我的主管要求我通过关联规则填写表格中的这个补丁,大部分学生姓名在表格中非常相似,如果有特定的名称,例如" USMAN"如果60个USMAN行具有性别MALE,那么在整个表格中有100个名称如USMAN,无论他们来自哪个城市,那么在白沙瓦是城市的补丁中的任何一行,并且学生的名字是Usman我应该设置其性别对男性

我希望我已经明确了我的问题我试图通过一些SQL查询来完成这项工作,如果任何人可以帮助我我会非常感谢

1 个答案:

答案 0 :(得分:0)

这是设置性别列的好方法。首先按名字汇总开始:

select FirstName, count(*), sum(case when gender = 'M' then 1 else 0 end) as NumMales,
       avg(case when gender = 'M' then 1.0 else 0.0 end) as MalePercent,
       (case when avg(case when gender = 'M' then 1.0 else 0.0 end) > 0.5 then 'M'
             else 'F'
        end) as ImputedGender
from Students s
where gender is not null
group by FirstName

接下来,您需要查看结果并设置截止值。具有特定姓名的单身男性或女性学生并不相信该名称会指定性别。所以,假设你需要至少五个例子和一个性别的80%:

select FirstName, count(*), sum(case when gender = 'M' then 1 else 0 end) as NumMales,
       avg(case when gender = 'M' then 1.0 else 0.0 end) as MalePercent,
       (case when avg(case when gender = 'M' then 1.0 else 0.0 end) > 0.5 then 'M'
             else 'F'
        end) as ImputedGender
from Students s
where gender is not null
group by FirstName
having count(*) >= 5 and
       avg(case when gender = 'M' then 1.0 else 0.0 end) not between 0.2 and 0.8

下一步是将估算的性别分配给行。这可能取决于各种SQL。这就像:

update Students
    set gender = ImputedGender
    from (<the above query>) ig
    where ig.Firstname = Students.FirstName and
          Students.city <> 'Peshawar' and
          Students.gender is null