설문조사 쿼리 문 짜는 것 즘 도와주세요 ㅠㅠ 0 7 2,674

by 캔디는맛있어 [Tibero] 오라클 쿼리 설문조사 [2021.08.03 20:22:21]


설문조사.xlsx (13,705Bytes)

설문조사 프로그램 짜다가 마지막 결과 통계 쿼리문 남았는데 만들다가 박터져서 구루비에 헬프 요청 합니다.

아래와 같이 데이터가 있다는 가정하에 부탁드립니다.

999는 기타입니다.

결과도 맨 하단에 추가했습니다.

혹시 몰라 엑셀로 첨부했으니 보기 힘드신 분들은 엑셀로 다운받아서 봐도 될듯합니다.

추가적으로 쿼리문에 대한 주석도 작성해주시면 감사하겠습니다. ^^

 

필드명,설명 및 DATA

A1 테이블(설문조사 관리)   A2 테이블(설문 문항 테이블)   A3테이블(설문 답 체크 테이블)
필드명 SURVEY_NO QUESTION_NO ETC   필드명 SURVEY_NO QUESTION_NO SURVEY_QUESTIONS   필드명 SURVEY_NO QUESTION_NO SURVEY_ANSWER ANSWER
설명 설문조사 번호 질문 번호 기타여부   설명 설문조사 번호 질문 번호 설문문항번호   설명 설문조사 번호 질문 번호 질문 답 답변자
data 50 1 Y   data 50 1 1   data 50 1 1 홍길동
50 2 N   50 1 2   50 2 3 홍길동
50 3 N   50 1 3   50 3 1|3 홍길동
50 4 Y   50 1 4   50 4 1|3|5 홍길동
          50 1 5   50 1 2 둘리
          50 2 1   50 2 4 둘리
          50 2 2   50 3 1|2|3 둘리
          50 2 3   50 4 1|2|3|4 둘리
          50 2 4   50 1 999 또치
          50 2 5   50 2 5 또치
          50 3 1   50 3 1|2 또치
          50 3 2   50 4 3|5|999 또치
          50 3 3            
          50 3 4            
          50 3 5            
          50 4 1            
          50 4 2            
          50 4 3            
          50 4 4            
          50 4 5            


 


결과

1번 질문의 결과   2번 질문의 결과
설문조사번호 질문 번호 질문 답 답변 수   설문조사번호 질문 번호 질문 답 답변 수
50 1 1 1   50 2 1 0
50 1 2 1   50 2 2 0
50 1 3 0   50 2 3 1
50 1 4 0   50 2 4 1
50 1 5 0   50 2 5 1
50 1 기타(999) 1          
                 
                 
3번 질문의 결과   4번 질문의 결과
설문조사번호 질문 번호 질문 답 답변 수   설문조사번호 질문 번호 질문 답 답변 수
50 3 1 3   50 4 1 2
50 3 2 1   50 4 2 1
50 3 3 3   50 4 3 3
50 3 4 0   50 4 4 1
50 3 5 0   50 4 5 2
          50 4 기타(999) 1
by 뉴비디비 [2021.08.03 23:38:33]
WITH A3 ("설문조사번호", "질문번호", SANS) AS (
    SELECT 50,1,'1'       FROM DUAL UNION ALL
    SELECT 50,2,'3'       FROM DUAL UNION ALL
    SELECT 50,3,'1|3'     FROM DUAL UNION ALL
    SELECT 50,4,'1|3|5'   FROM DUAL UNION ALL
    SELECT 50,1,'2'       FROM DUAL UNION ALL
    SELECT 50,2,'4'       FROM DUAL UNION ALL
    SELECT 50,3,'1|2|3'   FROM DUAL UNION ALL
    SELECT 50,4,'1|2|3|4' FROM DUAL UNION ALL
    SELECT 50,1,'999'     FROM DUAL UNION ALL
    SELECT 50,2,'5'       FROM DUAL UNION ALL
    SELECT 50,3,'1|2'     FROM DUAL UNION ALL
    SELECT 50,4,'3|5|999' FROM DUAL
)
SELECT * FROM (
    SELECT "설문조사번호", "질문번호"
        , SUM(REGEXP_COUNT(SANS, 1))  AS CNT1
        , SUM(REGEXP_COUNT(SANS, 2))  AS CNT2
        , SUM(REGEXP_COUNT(SANS, 3) ) AS CNT3
        , SUM(REGEXP_COUNT(SANS, 4) ) AS CNT4
        , SUM(REGEXP_COUNT(SANS, 5) ) AS CNT5
        , SUM(REGEXP_COUNT(SANS, 999))AS CNT999
    FROM A3
    GROUP BY "설문조사번호", "질문번호"
) 
UNPIVOT ( "답변수" FOR "질문답" IN ( CNT1 AS '1' ,CNT2 AS '2',CNT3 AS '3',CNT4 AS '4',CNT5 AS '5',CNT999 AS '기타(999)' ) )
WHERE NOT ( 질문답 = '기타(999)' AND 답변수 = 0 )
ORDER BY "설문조사번호", "질문번호", "질문답"

by 캔디는맛있어 [2021.08.04 09:13:23]

죄송한데 쿼리에 대한 주석도 가능하실까요;;;^^


by 캔디는맛있어 [2021.08.04 09:18:15]

추가적으로 제가 자세히 작성안해서 생긴 문제같은데... 만약 질문번호가 가변적일 경우 어떻게 해야하나요?? 2서부터 8번까지 있음


by 캔디는맛있어 [2021.08.04 11:33:57]

답변달아주셔서 감사합니다. ^^b


by 뉴비디비 [2021.08.04 20:37:35]

댓글을 늦게 확인했는데, 마농님께서 더 잘 알려주셨네요..


by 마농 [2021.08.04 09:47:12]
WITH a1 AS
(
SELECT 50 survey_no, 1 question_no, 'Y' etc FROM dual
UNION ALL SELECT 50, 2, 'N' FROM dual
UNION ALL SELECT 50, 3, 'N' FROM dual
UNION ALL SELECT 50, 4, 'Y' FROM dual
)
, a2 AS
(
SELECT 50 survey_no, 1 question_no, 1 survey_questions FROM dual
UNION ALL SELECT 50, 1, 2 FROM dual
UNION ALL SELECT 50, 1, 3 FROM dual
UNION ALL SELECT 50, 1, 4 FROM dual
UNION ALL SELECT 50, 1, 5 FROM dual
UNION ALL SELECT 50, 2, 1 FROM dual
UNION ALL SELECT 50, 2, 2 FROM dual
UNION ALL SELECT 50, 2, 3 FROM dual
UNION ALL SELECT 50, 2, 4 FROM dual
UNION ALL SELECT 50, 2, 5 FROM dual
UNION ALL SELECT 50, 3, 1 FROM dual
UNION ALL SELECT 50, 3, 2 FROM dual
UNION ALL SELECT 50, 3, 3 FROM dual
UNION ALL SELECT 50, 3, 4 FROM dual
UNION ALL SELECT 50, 3, 5 FROM dual
UNION ALL SELECT 50, 4, 1 FROM dual
UNION ALL SELECT 50, 4, 2 FROM dual
UNION ALL SELECT 50, 4, 3 FROM dual
UNION ALL SELECT 50, 4, 4 FROM dual
UNION ALL SELECT 50, 4, 5 FROM dual
)
, a3 AS
(
SELECT 50 survey_no, 1 question_no, '1' survey_answer, '홍길동' answer FROM dual
UNION ALL SELECT 50, 2, '3'      , '홍길동' FROM dual
UNION ALL SELECT 50, 3, '1|3'    , '홍길동' FROM dual
UNION ALL SELECT 50, 4, '1|3|5'  , '홍길동' FROM dual
UNION ALL SELECT 50, 1, '2'      , '둘리'   FROM dual
UNION ALL SELECT 50, 2, '4'      , '둘리'   FROM dual
UNION ALL SELECT 50, 3, '1|2|3'  , '둘리'   FROM dual
UNION ALL SELECT 50, 4, '1|2|3|4', '둘리'   FROM dual
UNION ALL SELECT 50, 1, '999'    , '또치'   FROM dual
UNION ALL SELECT 50, 2, '5'      , '또치'   FROM dual
UNION ALL SELECT 50, 3, '1|2'    , '또치'   FROM dual
UNION ALL SELECT 50, 4, '3|5|999', '또치'   FROM dual
)
SELECT a0.survey_no, a0.question_no, a0.survey_questions
     , COUNT(a3.survey_answer) survey_answer_cnt  -- 답변 카운트
  FROM (-- a2 의 항목에 a1 이 기타인 경우 999 추가
        SELECT survey_no, question_no, survey_questions
          FROM a2
         UNION ALL
        SELECT survey_no, question_no, 999 survey_questions
          FROM a1
         WHERE etc = 'Y'
        ) a0
  LEFT OUTER JOIN a3  -- a3 와 아우터 조인
    ON a0.survey_no = a3.survey_no
   AND a0.question_no = a3.question_no
   AND INSTR('|'||a3.survey_answer||'|', '|'||a0.survey_questions||'|') > 0 -- 문항 번호 있는지?
 WHERE a0.survey_no = 50  -- 설문번호 조건
 GROUP BY a0.survey_no, a0.question_no, a0.survey_questions  -- 그룹핑
 ORDER BY a0.survey_no, a0.question_no, a0.survey_questions  -- 정렬
;


 


by 캔디는맛있어 [2021.08.04 11:34:34]

마농님의 쿼리문 보고 깔끔하게 해결 되었습니다.

작성해주셔서 감사합니다.^^b

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