2014-03-27 3 views
0

인구 통계 데이터 세트에 쓰는 다소 복잡한 SQL Server 쿼리가 있습니다. 나는 얼마나 많은 응답자가 시스템에 특정 인구 통계를 알아낼 필요가있다.인구 통계 데이터 세트에 대한 강력한 SQL 쿼리

주 테이블이 2 개 있습니다. 관련 칼럼을 열거합니다. 각 행에 고유 한 ID가 있다고 가정합니다.

표 응답자 :

[RespondentID] [SystemEntryDate] 

표 RespondentProfiles : RespondentProfiles 응답자 링크에

[QuestionID] [AnswerID] 

응답자 ID. 응답 된 각 질문마다 행이 작성됩니다. 질문 id는 특정 질문 (성별, 민족, 주 및 자동차 소유권)에 해당하며 답변 ID는 질문에 따라 다른 것을 의미합니다. 1은 남성, 2는 여성, 1은 백인, 2 명의 히스패닉, 3 명의 태평양 섬 주민 등이 될 수 있습니다.

또한 Conditions라는 표가 있습니다. 조건 표는 다음과 같습니다.

[ConditionSetID] [QuestionID] [AnswerID] 

조건 집합 ID는 조건 집합과 함께 조건 집합에 연결됩니다. 그래서 조건 집합 ID를 질의에 전달할 수 있으며, 응답자가 해당 기준을 충족시키는 횟수와 해당 집합의 최소 및 최대 날짜를 반환합니다.

내 쿼리가 같은 것을 볼 것이다 : 예를 들어

create procedure query 

@ConditionSetID int 

as 

select count(distinct r.ID) as Respondents, 
     min(r.SystemEntryDate) as EarliestDate, 
     max(r.SystemEntryDate) as LatestDate 
    from Respondents r 
    join RespondentProfiles rp 
    on r.ID = rp.RespondentID 
    join Conditions c 
    on c.ConditionSetID = @ConditionSetID 
    and c.QuestionID = rp.QuestionID 
where rp.QuestionID = c.QuestionID 
    and rp.Condition = c.AnswerID 

을, 나는 응답자가이

[RespondentID] [QuestionID] [AnswerID] 

     10001  1 (gender) 1 (male) 
     10001  2 (ethnicity) 1 (white) 
     10001  3 (car)  23 (lexus) 
     10002  1 (gender) 2 (female) 
     10002  2 (ethnicity) 2 (black) 
     10002  3 (car)  24 (buick) 
     10003  1 (gender) 2 (female) 
     10003  2 (ethnicity) 1 (white) 
     10003  3 (car)  5 (honda) 
     10004  1 (gender) 1 (male) 
     10004  2 (ethnicity) 2 (black) 
     10004  3 (car)  24 (buick) 

같은 테이블을 프로필 및있을 수 있습니다 나는 특정 조건 세트 행을 선택하는 경우 ID는 다음과 같을 수 있습니다.

 [QuestionID] [AnswerID] 

     1 (gender) 2 (female) 
     2 (ethnicity) 2 (black) 
     3 (car)  24 (buick) 

이렇게하면 모든 흑인 여성에게 wh O EM 1.

의 수를 제공해야합니다 아니면 내가 가질 수있는, 뷰익 자신이 3 백성이 될 것이다 뷰익이나 렉서스를 소유하고 모든 사람에게 요구하고있다

 [QuestionID] [AnswerID] 

     3 (car)  23 (lexus) 
     3 (car)  24 (buick) 

.

그리고 최종 예를 들어 :

 [QuestionID] [AnswerID] 
     2 (ethnicity) 2 (black) 
     3 (car)  23 (lexus) 
     3 (car)  24 (buick) 

이이 검은 색과 렉서스를 소유하거나 모든 사람들에게 요구하고 검은 색과 이명 것 뷰익을 소유하고 모든 사람.

나는 이것이 끔찍하게 복잡하지 않다는 것을 알고있다. 그러나 나는 아직 시도한 가장 복잡한 일이며, 어떤 도움도 크게 감사 할 것이다. where 절을 설정하는 방법을 알아내는 데 많은 어려움을 겪고 있으며 일반적인 방향조차도 인정할 것입니다. respondentprofiles 테이블에는 약 800,000 개의 레코드가 있으므로 효율적이어야합니다.

내가 설정 한 where 절은 정확하지 않습니다. 다른 질문이 or'ed와 반대되는 것처럼 함께 기록되는 것처럼 레코드를 얻게되기 때문입니다. 따라서 하나의 답변 만 일치하더라도 해당 응답자의 행이 반환됩니다. 이는 잘못된 것입니다.특정 응답자는 선택하도록 설정된 조건의 모든 조건을 충족해야합니다.

아마 내가 임시 테이블 질문을 한 번에 선택해야합니까? 아니면 어떤 종류의 그룹화를 사용합니까? 나는이 곳을 어디로 가야하는지 정말로 혼란 스럽다. 나는 나의 딜레마를 적절히 설명하기에 충분한 정보를 제공했으면한다. 대답 응답자의 응답자 ID를 얻을하는 방법을 보여줍니다 아래

+0

조건 테이블이 필요하다고 생각하지 않습니다. 관리하기가 매우 어렵다고 생각합니까? 이러한 테이블을 사용하지 않고 (서브 쿼리 또는 인라인 뷰를 사용하여) 2 개의 응답 만이 아닌 응답 프로파일을 집합 적으로 쿼리 할 수 ​​있습니다. –

+0

mysql 또는 sql 서버를 사용하고 있습니까? 둘 다 태그를 붙였습니다. –

답변

0

예제 : C를, 을 질문하기를 B에 의문을 예, 아니오 의문을 제기하지 않으려면 예를 실제로 SQL 서버를 사용하는 가정

(당신을

select id 
    from RespondentProfiles 
where QuestionID = 'a' 
    and AnswerID = 'yes' 
intersect 
select id 
    from RespondentProfiles 
where QuestionID = 'b' 
    and AnswerID = 'no' 
intersect 
select id 
    from RespondentProfiles 
where QuestionID = 'c' 
    and AnswerID = 'yes' 

을 또는 당신이 MySQL을 사용하는 경우 다음을 사용할 수 있습니다 : 모두 MySQL과 질문에서 SQL Server를) 태그, 당신은 사용할 수 있습니다

select id 
    from RespondentProfiles x 
where QuestionID = 'a' 
    and AnswerID = 'yes' 
    join (select id 
      from RespondentProfiles 
     where QuestionID = 'b' 
      and AnswerID = 'no') y 
    on x.id = y.id 
    join (select id 
      from RespondentProfiles 
     where QuestionID = 'c' 
      and AnswerID = 'yes') z 
    on y.id = z.id 

그냥 내 의견에 무엇을 넣어 - 내 조건 테이블에 대한 필요가 없습니다 내 대답을 추가 할 수 있습니다. 2 개 이상의 질문에 대해 특정 방식으로 답변하는 응답자를 쿼리하기 위해 이러한 테이블을 가질 필요는 없습니다. 인라인보기 및/또는 하위 쿼리를 사용하여이를 수행 할 수 있습니다. (또는 SQL 서버의 경우 교차 집합 연산자)

관련 문제