我有一个相当复杂的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。因此,即使只有一个答案匹配,它也会为该答复者返回一行,这是错误的。特定的被访者必须满足所选条件的所有条件。
也许我需要一次选择一个临时表问题或什么?或者使用某种分组?我真的很困惑在哪里去与此。我希望我已经提供了足够的信息来充分证明我的困境。
我不相信你的条件表需要,我想它也很难维护?您可以共同查询受访者配置文件,在这些配置文件中,如果不使用此类表(通过使用子查询或内联视图),它们不仅有1个答案。 –
你使用的是mysql还是sql server?你标记了两个。 –