2013-01-02 41 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