2012-12-18 18 views
0

나는이 4 개 도시에서이 테이블에 모여복잡 한 SQL 쿼리 suggesion

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

데이터는 다음과 같은 구조를 가지고

내가 내 SQL 데이터베이스 의 학생 테이블이 응용 프로그램을 건물입니다 카라치, 이슬라마바드, 페샤와르, 카라치

페샤와르에서 수집 한 학생 데이터에는 성별 속성이 설정되어 있지 않으므로이 전체 테이블에서 페샤와르 출신 학생의 성별 열에는 값이 없습니다.

내 감독자가 협회 규칙을 통해 테이블의이 패치를 작성하도록 요청했습니다. 대부분 학생 이름이 테이블을 통해 상당히 유사하며 "USMAN"과 같은 특정 이름이 있고 100 개의 이름이있는 경우 60 USMAN 행에 성별 남성이있는 경우 도시 전체와 상관없이 USMAN이 표시되고 peshawar가 도시이고 학생 이름이 Usman 인 패치의 행

나는 내 문제를 분명히했으면 좋겠어. 나는 어떤 SQL 쿼리를 통해이 작업을하려고 노력하고있다. 아무도 내가 ful에게 매우 고마워 할 수 있다면 도움이된다.

+0

죄송합니다. 아직 이해가되지 않습니다. 샘플 결과를 줄 수 있습니까? 두 명의 학생이 같은 아버지를 둘 수 있습니까? 그렇다면 표를 표준화해야합니다. – Kermit

+0

잘 알고 있다면 각성에 대해 가장 많이 대표되는 성별을 구하고이 데이터에서이 성을 사용하여 이름이 같고 성별이 다른 사람들의 성을 업데이트하고 싶습니까? 어떤 DB 엔진을 사용하고 있습니까? –

+0

예 선생님 정확히 내가 무엇을하려고하는지입니다. SQL Server 2012 – user1676346

답변

0

이것은 성기 C를 설정하기위한 좋은 트릭이다. olumn. 먼저 이름으로 요약하여 시작하십시오.

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 

다음으로 결과를보고 컷오프를 설정해야합니다. 특정 이름의 남성 또는 여성 학생 한 명은 그 이름이 성을 부여한다는 것을 확신하지 못합니다. 행에 전가 성별을 할당

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 

다음 단계는 : 그래서, 당신은 하나 개의 성에서 적어도 다섯 예 80 % 필요하다고. 이는 다양한 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 
+0

친애하는 고든은 매우 감사합니다. 그러나 저는 SQL에 익숙하지 않습니다. 이것들은 정말로 복잡한 질문입니다. 이것을 이해하다 – user1676346