简单的SQL查询来计算轮询结果

时间:2013-01-02 15:38:00

标签: sql sql-server tsql

根据下面显示的db模式,为PollResponses表计算特定PollId的轮询结果的最佳和有效方法是什么

enter image description here

如果我们对该特定民意调查有四个选项

,我想拥有以下类型的数据
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表的这个数据 enter image description here

我得到了这个结果

enter image description here

虽然我应该得到 没有0 是1

所有三个表的当前数据

  1. 投票
  2. enter image description here

    1. PollOptions
    2. enter image description here

      1. PollResponse
      2. enter image description here

4 个答案:

答案 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;

请参阅SQL Fiddle with Demo

根据您提供的样本数据,结果将是:

| 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;

请参阅SQL Fiddle with Demo

结果:

| 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

如果未连接响应和选项,则无法直接获取每个选项的响应数。