用于计算轮询结果的简单SQL查询

用于计算轮询结果的简单SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,根据下面所示的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

根据下面所示的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

所有三个表的当前数据

  • 民意测验
  • 波尔选项
  • 花粉反应

  • 虽然我没有你的数据,但这里有一个非常粗略(即未经测试)的想法,你应该做什么。基本上,您可以
    内部联接表
    ,然后使用聚合函数
    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
    列编制索引。

    虽然我没有您的数据,但这里有一个非常粗略(即未经测试)的想法,您应该做什么。基本上,您可以
    内部联接表
    ,然后使用聚合函数
    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
    

    关于效率,我可以看到您正在使用主键和外键约束;您可以做的另一个性能改进是在
    pollpoptions
    表上为您的
    OptionText
    列编制索引。

    我相信您编写的查询缺少联接。您所显示的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
    

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

    我相信您编写的查询缺少连接。您所显示的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
    

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

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

    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对数据进行排序,则必须将其包含在
    分组中:

    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 |
    

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

    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对数据进行排序,则必须将其包含在
    分组中:

    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 |
    


    抱歉,结果不正确,而且我们必须像这样传递PollId=@pPollId,在其中queryEdited包含输入参数,您能描述您看到的结果集吗?结果是12行,计数为1,而它应该是4行,计数为其错误结果不正确,此外,我们必须像这样传递PollId=@pPollId,其中queryEdited包含输入参数,您能描述一下您看到的结果集吗?结果是12行,计数为1,而它应该是4行,计数为1,工作正常,但我想在其中添加where子句,因为我想获取特定对象的结果pollId@AbhishekGupta已将
    WHERE
    子句添加到查询中,该查询面临一个有关此项准确性的问题解决方案发布屏幕截图简略请查看更新的问题您的查询结果已在此处提及,工作正常,但我想在其中添加where子句,因为我想获取特定问题的结果pollId@AbhishekGupta已将
    WHERE
    子句添加到查询中,该查询面临有关此解决方案发布准确性的一个问题屏幕截图请查看更新的问题您的查询结果已在此处提及您可以发布每个表中的数据吗?您好,您可以发布其他两个表的外观吗?您可以发布每个表中的数据吗?您好,您可以发布其他两个表的外观吗?上面的查询没有显示计数为0的行,即使在添加缺少的关系(如您所说)之后,上面的查询也没有显示计数为0的行,即使在添加缺少的关系(如您所说)之后,您的sql也没有返回计数为“否”和0的行,我认为这个看起来简单的任务变得越来越有趣:)试着用p运行。_id=104,然后它应该返回yes 1和No 0。@AbhishekGupta查看我的编辑,我更改了连接的顺序,它似乎对所有轮询都有效。:)是的,它现在正在工作,但我想我应该通过optionid订购,因为“否”先出现,然后“是”,而“是”应先出现,然后出现no@AbhishekGupta您只需要添加一个
    order by
    子句,但必须将您的order by值添加到
    group by
    。查看我的编辑您的sql也没有返回一个“否”和0作为计数的行,我认为这个看起来简单的任务变得更有趣:)尝试使用p运行。_id=104,然后它应该返回yes 1和no 0。@AbhishekGupta查看我的编辑,我更改了连接的顺序,并且似乎对所有轮询都有效。:)是的,它现在正在工作,但我想我应该通过optionid订购,因为“否”先出现,然后“是”,而“是”应先出现,然后出现no@AbhishekGupta您只需要添加一个
    order by
    子句,但必须将您的order by值添加到
    group by
    。查看我的编辑