2011-05-05 7 views
1

예 (1) 또는 아니오 (0) 답변이 모두 필요한 5 가지 질문이있는 설문 조사 관련 응용 프로그램 용 테이블이 있습니다.SQL 쿼리 - 질문 그룹에 대한 예 응답 수를 계산합니다.

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에 의해 I 고장, 응답자의 수 0 "예"응답 (5 점 만점), 1 점 "예"대답 (5 점 만점), 2 점 "예"대답 (2 점 중 2 점) 등이있었습니다. 모든 질문, 예 중 5 질문 중 4 개 등

Doable? 모든 제안은 감사드립니다 :)

답변

-1

저장 프로 시저를 만들고 값을 변수로 설정하면 sproc 내에서 select 문을 사용하고 조건절로 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 (Common Table Expression)를 사용하십시오.

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

우수한 로보! 그게 바로 제가 찾던 것입니다. Michael과 Jon은 당신의 질문을 통해 올바른 결과를 얻었지만 Lobo의 형식은 내가 필요한 것입니다. 각 프로젝트에 대해 항목이 하나씩 있습니다 (예 : 가로 열의 합계). 어쩌면 나는 내 요청에 더 많은 세부 사항을 제공 했어야했다. 모두에게 감사드립니다! – xtreme416

+0

@ xtreme416 - FAQ 페이지에 따르면 가장 유용한 대답을 허용 된 대답으로 표시해야합니다. :) – Lobo

+0

@Jon of All Trades - 나는 편집 할 수는 있지만 답을 말할 수는 없으므로 행을 열로 변환 할 때 'SUM (Answers)'이 필요합니까? 노력하고 싶지만 피벗을 지원하지 않는 Sybase가 있습니다. 감사! – Lobo