설문조사 쿼리 질문 합니다. 0 3 3,356

by 치비 [SQL Query] [2016.09.18 20:55:56]


안녕하세요! 

저가 이번에 설문조사 쿼리를 만들던중 궁금한 점이 있어서 질문 드립니다.

번호 질문1 질문2 질문3 질문4 질문5
1 매우좋음 좋은 보통 불만 매우불만
2 보통 불만 좋은 매우좋은 좋음
3 좋음 좋음 보통 보통 보통

위의 테이블을 보시면 저가 100명 정도 되는 사람들의 설문조사를 진행할 수 있는 테이블을 만들어 봤습니다.

쿼리는 

update 설문조사TB 질문1 = ?, 질문2=?, 질문3=?, 질문4=?, 질문5=? where 번호 = ?
select sum(decode(질문1, '매우좋음', 1, 0)) verygood1,
            sum(decode(질문1, '좋음', 1, 0)) good1 
            sum(decode(질문1, '보통', 1, 0))  soso1 from 설문조사TB;

이렇게 열값을 하나하나 해서 sum값으로 구하다 보니 5개의 질문만 해도 25개의 열값을 지정해야 하는것을 알게 되었습니다.

그래서 좀더 편하게 하기 위해서 

select count(질문1) ques1 from 설문조사 where 질문1 is not null group by 질문1 order by 질문1;

이렇게 해봤지만 질문1에 대한 분류는 가능하지만 다른 질문은 못하더군요....

아래와 같은 표처럼 질문별 대답한 값을 구룹해서 구하려면 어떤 쿼리를 써야하는지 궁금해서 여쭤 봅니다.

아니면 설문조사 테이블 구조에 대해서 조언을 해주셔도 대단히 감사드립니다.!!

감사합니다. 행복하세요!~

  질문1 질문2 질문3 질문4
매우좋음 4 3 2 2
좋음 4 3 3 3
보통 4 5 5 5
불만 3 2 5 3
매우불만 1 2 3 4

 

 

by 마농 [2016.09.19 09:05:10]

애초에 테이블 설계를 다르게 했으면 좋았을 듯 하네요.
질문을 횡으로 펼치지 말고 종으로 내리는게 여로모로 좋습니다.
(사람ID, 질문NO, 응답번호)
 

WITH tb AS
(
SELECT 1 no, '매우좋음' q1, '좋음' q2, '보통' q3, '불만' q4, '매우불만' q5 FROM dual
UNION ALL SELECT 2, '보통', '불만', '좋음', '매우좋음', '좋음' FROM dual
UNION ALL SELECT 3, '좋음', '좋음', '보통', '보통', '보통' FROM dual
)
SELECT *
  FROM tb
 UNPIVOT (v FOR gb IN (q1, q2, q3, q4, q5))
 PIVOT (COUNT(no) FOR gb IN ('Q1' q1, 'Q2' q2, 'Q3' q3, 'Q4' q4, 'Q5' q5))
;

 


by 치비 [2016.09.20 10:36:57]

대단히 감사합니다!! 피봇 테이블 사용이 관건이었군요!

마농님 께서 테이블 설계시 질문을 횡으로 늘리는것 보다

열값으로 아래로 내리는 구조가 좋다고 말씀 해주셨는데

위의 쿼리문은 아래로 내리는 구조에 대한 설문조사를 예로 들어 주신건가요???


by 마농 [2016.09.20 10:53:49]

횡으로 표현된 원질문 그대로의 집합을 원본으로 하는 것입니다.
WITH 문을 이용해 원본을 만들었구요.
UNPIVOT 구문은 횡으로 표현된 것을 종으로 바꾸는 구문입니다.
단계별로 나누어 UNPIVOT 구문까지만 실행해 보시면 이해하기 쉬울 듯 하네요.
애초에 종으로 설계되었다면 UNPIVOT은 불필요한 부분이겠죠.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입