2016-12-13 7 views
3

「Crunchy」と回答したすべてのユーザーを選択し、「Straight」と回答して、「Crunchy」に回答したすべてのユーザーの割合として返します。複数のselectステートメントに基づいてユーザーの割合を照会

最後の試合は、Crunchyに回答したユーザーの70%が「Straight」と回答したというような事実を生み出すことです。

SELECT * 
    FROM 
    ((SELECT *  
     FROM answers 
     WHERE (question_id = 1 AND answer = 'Crunchy')) A 

    JOIN 

    (SELECT *  
     FROM answers 
     WHERE (question_id = 3 AND answer = 'Straight')) B 

    ON A.user_id = B.user_id) 
    GROUP BY A.user_id 

この意志:これまでのところ、私はカリカリ答えてもストレート答えたすべてのユーザーを選択するクエリを持っている

((Select all unique users where answer === Crunchy && where answer === Straight) 

/

(Select all unique users where answer === Crunchy)) 

* 100 = % 

|id |question_id | user_id | answer | 
|-------------------------------------| 
|1 | 1  | 81  | Crunchy | 
|2 | 1  | 82  | Crunchy | 
|3 | 1  | 83  | Smooth | 
|4 | 2  | 81  | Straight | 
|5 | 2  | 82  | Diagonal | 
|6 | 2  | 83  | Diagonal | 

擬似コードは、次のようなものになるでしょう両方の回答を選択したすべてのユーザーを選択しますが、私はそれを合計として持つ必要がありますので、最初のものと同じになりますが2番目のクエリで分割することができます。

SELECT *  
     FROM answers 
     WHERE (question_id = 1 AND answer = 'Crunchy' 

そして100

によってその答えを掛けてどのように私はこのSQLクエリの残りの部分を完了するか、このついて行くために、より簡単な方法はありますか?

答えて

2

LEFT JOINを使用して関連付けることができます。 answer = 'Straight'と一致する行がありません場合

SELECT IF(COUNT(*) = 0, 0, COUNT(a2.user_id)/COUNT(*)*100) AS percentage 
FROM answers AS a1 
LEFT JOIN answers AS a2 ON a1.user_id = a2.user_id 
    AND a2.question_id = 2 AND a2.answer = 'Straight' 
WHERE a1.question_id = 1 AND a1.answer = 'Crunchy' 

LEFT JOINa2列のNULLを返します。 COUNT(a2.user_id)はnull以外の値のみをカウントするので、これはStraightと回答したすべてのユーザーをカウントします。一方、COUNT(*)はすべての行をカウントします。これはすべてCrunchyの回答です。

IF()は、Crunchyの回答がない場合、0による除算から保護します。

+1

これは私が必要としていたものです。 Barmarに感謝します。私が元来持っていたものよりもはるかに簡潔です。 – Stretch0

関連する問題