2012-07-04 26 views
4

我有一個數據庫表,其中包含用戶提交的3個問題的答案。所有對這些問題的答案都是「是/否」的答案。像這樣在多列中計數值mysql

username  question1   question2   question3 

user1   yes    no    yes 
user2   yes    yes    yes 
user3   yes    no    no 
user4   no     no    no 

我想要做的是收集每列'是'的計數。所以我會有每個問題的數量是'問題1'='3',問題2 ='1'等等等

目前我有3個單獨的聲明,每個問題的工作正常,但我只是想知道是否有辦法將這些結合到一個聲明中以使其更有效?

+1

你可以發佈你的sql語句讓我們看看要結合什麼嗎? – Feanor

+0

如果你會使用int值(而不是可能產生問題的字符串),讓我們假設1是0,否則你可以使用每列的總和 – mishu

+0

理論上我認爲這可能是可能的但我懷疑它會需要大量的自我加盟和聯盟才能做到。 – GordonM

回答

4

這可以通過圍繞CASE語句的簡單聚合SUM()(沒有GROUP BY)完成。如果值爲yes,則返回1,否則返回0.然後,將這些1通過SUM()添加到列上。

SELECT 
    SUM(CASE WHEN question1 = 'yes' THEN 1 ELSE 0 END) AS q1, 
    SUM(CASE WHEN question2 = 'yes' THEN 1 ELSE 0 END) AS q2, 
    SUM(CASE WHEN question3 = 'yes' THEN 1 ELSE 0 END) AS q3 
FROM yourtable 

MySQL也將允許一個簡單的布爾比較返回1或0,但是這不是移植到其他RDBMS。

/* Shorter version, only works for MySQL */ 
SELECT 
    SUM(question1 = 'yes') AS q1, 
    SUM(question2 = 'yes') AS q2, 
    SUM(question3 = 'yes') AS q3 
FROM yourtable