2013-01-02 43 views
0

什么是计算从PollResponses表投票结果为特定PollId按分贝图所示的模式最好的和有效的方式简单的SQL查询来计算投票结果

enter image description here

我想有以下类型的数据如果我们有特定的调查

optionText 
count 
optiontext 
count 
optiontext 
count 
optiontext 
count 

例如,四个选项

Obama 
2000 
Romney 
1800 
Clinton 
3000 
Xyz 
1200 

共8行使用下面的查询

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

即时得到这个结果

获取

我使用SQL Server 2012 SP1更新

enter image description here

而我应该得到 否0 是1

当前所有三个表的数据

  1. 投票

enter image description here

  • PollOptions
  • enter image description here

  • PollResponse
  • enter image description here

    +0

    您可以发布从每个表的数据? – Taryn

    +0

    你好,你可以发布其他2个表的样子吗? –

    回答

    0

    我相信这将返回结果你想要的:

    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 | 
    
    +0

    嘿你的SQL也没有返回与“否”和0作为计数的行,我认为这个简单的寻找任务变得越来越有趣:) – Abhi

    +0

    尝试与p._id = 104运行,然后它应该返回是1和没有0。 – Abhi

    +0

    @AbhishekGupta看到我的编辑,我改变了连接的顺序,它似乎适用于所有民意调查。 :) – Taryn

    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 
    
    +0

    抱歉,结果不正确,而且我们必须在其中查询时通过PollId = @pPollId。 – Abhi

    +0

    编辑为包含输入参数,可以描述您所看到的结果集吗? –

    +0

    结果是12行与计数1,而它应该是4行与它的计数 – Abhi

    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 
    

    有关效率,我可以看到你使用主键和外键约束;您可以进行的另一项性能改进是将您的PollOptions表中的OptionText列索引。

    +0

    工作正常,但我想在其中添加where子句,因为我想要获取特定pollId的结果 – Abhi

    +0

    @AbhishekGupta已添加'WHERE'子句查询 –

    +0

    我正面临一个关于此解决方案发布屏幕快照准确性问题的问题 – Abhi

    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 
    

    如果响应和选项没有连接,那么你不能直接得到每个选项的响应数。

    +0

    上面的查询未显示包含计数0的行,即使在添加缺少的关系之后由你 – Abhi