根据下面显示的db模式,为PollResponses表计算特定PollId的轮询结果的最佳和有效方法是什么
如果我们对该特定民意调查有四个选项
,我想拥有以下类型的数据optionText
count
optiontext
count
optiontext
count
optiontext
count
实施例
Obama
2000
Romney
1800
Clinton
3000
Xyz
1200
总共获取了8行
我正在使用SQL Server 2012 sp1更新
使用以下查询
select options.OptionText as [optionText]
,count(responses._id) as [count]
from Polls polls
inner join PollOptions options on options.PollId = polls._id
inner join PollResponses responses on responses.PollId = polls._id
where polls._id = 104
group by options.OptionText, polls._id
使用pollresponse表的这个数据
我得到了这个结果
虽然我应该得到 没有0 是1
所有三个表的当前数据
答案 0 :(得分:2)
虽然我没有您的数据可用,但这是一个非常粗略(即未经测试)的想法,你应该做什么。你基本上INNER JOIN
你的表,然后使用聚合函数COUNT
计算每个分组候选人的所有响应。
select options.OptionText as [optionText]
,count(responses._id) as [count]
from Polls polls
inner join PollOptions options on options.PollId = polls._id
inner join PollResponses responses on responses.PollId = polls._id
where polls._id = @pollid
group by options.OptionText, polls._id
关于效率,我可以看到你正在使用主键和外键约束;您可以进行的另一项性能改进是将OptionText
列上的PollOptions
列编入索引。
答案 1 :(得分:1)
SELECT
po.OptionText AS [optionText],
COUNT(pr._id) AS [count]
FROM PollResponses pr
JOIN Polls p ON (p._id = pr.PollID)
JOIN PollOptions po ON (po.PollID = p._id)
WHERE p._id = @pPollId
GROUP BY po.OptionText, pr._id
答案 2 :(得分:1)
我相信这会返回你想要的结果:
select po.optiontext,
count(pr.optionid) Total
from PollOptions po
left join polls p
on p._id = po.pollid
left join pollresponse pr
on p._id = pr.pollid
and pr.optionid = po._id
-- where p._id = 104
group by po.optiontext;
根据您提供的样本数据,结果将是:
| OPTIONTEXT | TOTAL |
----------------------
| HOD IT | 1 |
| HOD Mech | 1 |
| Mr. CS | 2 |
| no | 0 |
| yes | 1 |
编辑,如果您想按选项ID订购数据,则必须将其包含在group by
中:
select po.optiontext,
count(pr.optionid) Total
from PollOptions po
left join polls p
on p._id = po.pollid
left join pollresponse pr
on p._id = pr.pollid
and pr.optionid = po._id
--where p._id = 104
group by po.optiontext, po._id
order by po._id;
结果:
| OPTIONTEXT | TOTAL |
----------------------
| Mr. CS | 2 |
| HOD IT | 1 |
| HOD Mech | 1 |
| yes | 1 |
| no | 0 |
答案 3 :(得分:0)
我相信你写的查询缺少一个连接。 。 。您显示的ER图中也缺少这个。但是,结果表具有OptionID。据推测,给定的民意调查有多种选择。所以试试这个:
select options.OptionText as [optionText], polls._id, count(responses._id) as [count]
from Polls polls inner join
PollOptions options
on options.PollId = polls._id inner join
PollResponses responses
on responses.PollId = polls._id and responses.OptionId = options._Id
where polls._id = 104
group by options.OptionText, polls._id
如果未连接响应和选项,则无法直接获取每个选项的响应数。