2014-03-27 34 views
0

我有一个相当复杂的SQL Server查询(至少对我来说),以对人口统计数据集写。我需要弄清楚系统中有多少人回答了具体的人口统计数据。强大的SQL查询中设置

我有2个主表。我将列出相关的专栏。假设每行都有唯一的ID。

表回答者:

[RespondentID] [SystemEntryDate] 

表RespondentProfiles:

[QuestionID] [AnswerID] 

上受访链接RespondentProfiles被申请人ID。对于每个回答的问题,都会创建一行。问题ID对应于一个具体问题(比如性别,种族,州和汽车所有权),答案ID意味着不同的问题。像1是男性,2是女性,或1可能是白色,2是西班牙裔,3是太平洋岛民,等等。

我也有一个表称为条件。条件表如下所示:

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

如果我选择一个特定的条件集,行编号可能是这样的:

 [QuestionID] [AnswerID] 

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

这将要求所有的黑人女性wh Ø拥有别克,这应该给EM的1

计数或我可以有:

 [QuestionID] [AnswerID] 

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

这是要求大家谁拥有别克或雷克萨斯,这将是3人。

然后作为最后一个例子:

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

这是要求大家谁是黑的,拥有一辆雷克萨斯或大家谁是黑色的,拥有别克,这将是2人。

我知道这不是非常复杂,但它是我尝试过的最复杂的事情,任何帮助将不胜感激。我在确定如何设置where子句方面遇到了很多麻烦,甚至一般的指导方向都值得赞赏。 respondentprofiles表中还有大约80万条记录,因此它必须高效。

我设置的Where子句不太正确,因为它只会得到记录,就好像不同的问题一起被存储在一起,而不是和and.ed。因此,即使只有一个答案匹配,它也会为该答复者返回一行,这是错误的。特定的被访者必须满足所选条件的所有条件。

也许我需要一次选择一个临时表问题或什么?或者使用某种分组?我真的很困惑在哪里去与此。我希望我已经提供了足够的信息来充分证明我的困境。

+0

我不相信你的条件表需要,我想它也很难维护?您可以共同查询受访者配置文件,在这些配置文件中,如果不使用此类表(通过使用子查询或内联视图),它们不仅有1个答案。 –

+0

你使用的是mysql还是sql server?你标记了两个。 –

回答

0

下图显示如何让受访者谁回答的受访者的ID的例子: 审讯的,是 要问B,没有 质疑C,是

你实际使用的是SQL服务器假设(你标签MySQL和你的问题的SQL Server),你可以使用:

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,你可以使用:

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 server的情况下,相交集运算符)