2011-05-05 62 views
1

我有一個調查相關應用程序的表,其中有5個問題都需要是(1)或否(0)答案。該表設計如下:SQL查詢 - 計算一組問題的yes答案數

CREATE TABLE score ( project_id int NOT NULL, resp_id int NULL, q1 int, q2 int, q3 int, q4 int, q5 int, );

的樣本數據:

project_id resp_id q1 q2 q3 q4 q5 
1   86  1 1 1 1 1 
1   114  1 1 1 1 1 
1   118  0 1 1 1 0 
2   154  1 1 0 1 1 
2   178  1 1 1 0 1 
3   182  1 0 1 1 1 
3   190  1 1 1 0 1 
3   208  1 1 1 1 1 
3   300  1 1 1 0 0 
3   329  1 1 1 1 1 

我需要做的是編寫一個查詢,將生成一個報告,我通過PROJECT_ID擊穿,受訪人數提供0個「是」答案(5箇中的0個),1個「是」答案(5箇中的1個),2個「是」答案(5箇中的2個)等。換句話說,有多少答覆者回答「是」所有問題,是5個問題中的4個,等等。

可行嗎?任何建議表示讚賞:)

回答

-1

創建一個存儲過程並將值設置爲變量,然後您可以使用一個select語句在sproc中傳遞它們,並有條件地使用where子句。

3
SELECT 
    project_ID, 
    q1 + q2 + q3 + q4 + q5 AS NumYesAnswers, 
    COUNT(*) AS NumResponses 
FROM 
    score 
GROUP BY 
    project_ID, q1 + q2 + q3 + q4 + q5 

編輯

我想補充這爲路寶的答案註釋,但格式是行不通的。你可以多一點優雅與PIVOT達到同樣的效果:

所有交易答案
SELECT 
    Project_ID, "0" AS NoToAll, "1", "2", "3", "4", "5" 
FROM 
    (
    SELECT Project_ID, Q1 + Q2 + Q3 + Q4 + Q5 AS NumYeses, COUNT(*) AS Answers 
    FROM Score 
    GROUP BY Project_ID, Q1 + Q2 + Q3 + Q4 + Q5 
    ) AS X 
PIVOT 
    (SUM(Answers) FOR NumYeses IN ("0", "1", "2", "3", "4", "5")) AS Y 
0

喬恩是很好的。另外,如果您不想重複sum語句,則使用CTE(公用表表達式)。

With 
ProYes as (
    select project_id, 
    q1 + q2 + q3 + q4 + q5 as NumYes 
    from score) 
select project_id, NumYes, COUNT(*) as NumAnswers 
from ProYes 
group by project_id, NumYes 
0
-- Be careful about NULL fields(the following is assuming that the q* are NOT NULL fields) 
SELECT project_id, 
    SUM(allzeroes) AS NoToAll, SUM(onlyone) AS YesToOne, SUM(two) AS YesToTwo, SUM(three) AS YesToThree, SUM(four) AS YesToFour, SUM(five) AS YesToAll 
FROM (
    SELECT project_id, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 0 THEN COUNT(*) ELSE 0 END) AS allzeroes, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 1 THEN COUNT(*) ELSE 0 END) AS onlyone, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 2 THEN COUNT(*) ELSE 0 END) AS two, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 3 THEN COUNT(*) ELSE 0 END) AS three, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 4 THEN COUNT(*) ELSE 0 END) AS four, 
     (CASE WHEN (q1 + q2 + q3 + q4 + q5) = 5 THEN COUNT(*) ELSE 0 END) AS five 
    FROM score 
    GROUP BY project_id, (q1 + q2 + q3 + q4 + q5)) temp_table 
GROUP BY project_id 

PS:請修正採樣數據報頭;我無法編輯你的問題。謝謝!

+0

優秀的路寶!這正是我所期待的。邁克爾和喬恩,你的詢問也給出了正確的結果,但路寶的格式是我所需要的。每個項目都有一個條目,其中包括「是」的總和。也許我應該在我的要求中提供更多細節。感謝大家! – xtreme416 2011-05-06 14:15:56

+0

@ xtreme416 - 常見問題解答頁面說,您應該將最有幫助的答案標記爲已接受的答案。 :) – Lobo 2011-05-06 15:31:04

+0

@Jon所有交易 - 我可以編輯,但不能評論你的答案,所以這裏是我的問題 - 當你只是將行轉換爲列時需要'SUM(Answers)'?我會嘗試,但我有Sybase不支持樞軸。謝謝! – Lobo 2011-05-06 16:44:29