안녕하세요!
저가 이번에 설문조사 쿼리를 만들던중 궁금한 점이 있어서 질문 드립니다.
번호 | 질문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 |
애초에 테이블 설계를 다르게 했으면 좋았을 듯 하네요.
질문을 횡으로 펼치지 말고 종으로 내리는게 여로모로 좋습니다.
(사람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)) ;