투표 결과에 대한 목록조회 질문입니다. 0 4 987

by KYoung [SQL Query] 투표 [2017.06.12 12:30:35]


테이블 정보

컨텐츠 투표항목 투표 
EPI_SEQ(PK)
CONTENT_SEQ(PK)

EPI_SEQ(PK)
CONTENT_SEQ(PK)
GOODS_SEQ(PK)

EPI_SEQ(PK)
CONTENT_SEQ(PK)
USER_KEY(PK)

...

TITLE
...

GOODS_SEQ(FK)

 

컨텐츠 데이터

EPI_SEQ CONTENT_SEQ
1 1
2 2
3 3
4 4

 

투표항목 데이터

EPI_SEQ CONTENT_SEQ GOODS_SEQ TITLE
1 1 1 항목1-1
1 1 2 항목1-2
2 2 3 항목2-1
2 2 4 항목2-2
3 3 5 항목3-1
3 3 6 항목3-2
4 4 7 항목4-1
4 4 8 항목4-2

 

투표 데이터

EPI_SEQ CONTENT_SEQ USER_KEY GOODS_SEQ
1 1 user1 1
1 1 user2 1
1 1 user3 1
1 1 user4 2
2 2 user1 3
2 2 user2 3
2 2 user3 4
2 2 user4 4
3 3 user1 5
3 3 user2 5
3 3 user3 6

 

(설명 추가)
EPI_SEQ는 컨텐츠의 상위 테이블의 PK값입니다.
컨텐츠별 투표항목은 2개로 고정입니다.
투표테이블에 USER_KEY는 중복투표 방지값이고
투표테이블에 항목 KEY 값이 저장되어 집계하여 비율을 계산합니다.

 

원하는 결과(수정)

 EPI_SEQ | CONTENT_SEQ | TITLE1 | RATIO1 | TITLE2 | RATIO2

 1    | 1    | 항목1-1 | 75% | 항목1-2 | 25%
 2    | 2    | 항목2-1 | 50% | 항목2-2 | 50%
 3    | 3    | 항목3-1 | 66% | 항목3-2 | 33%
...
 

컨텐츠에 대한 투표 항목들은 2개로 고정입니다.
2개 고정으로 목록에서 그래프 형태로 %를 표시합니다. ( ex: TITLE1 30% ===|======= 70% TITLE2 )
컨텐츠 하나에대한 항목별 투표율은 어찌어찌 구하겠는데
지난 투표결과에 대한 목록 조회 쿼리 작성에 어려움을 겪고있어서 질문 드립니다.
자세한 답변이 아니어도 문제 해결에 도움이 되는 검색 키워드라도 알려주시면 감사하겠습니다.

DB는 Oracle 입니다.

by 마농 [2017.06.12 15:04:08]

주신 정보만으로는 모호하네요.
예시자료를 보여주세요.
원본대비 결과표로 보여주세요.


by KYoung [2017.06.12 15:39:14]

죄송합니다.
정신이없어서 부족하게 설명을 적은거같습니다.
수정했습니다.


by 마농 [2017.06.12 15:56:20]
WITH t1 AS
(
SELECT 1 epi_seq, 1 content_seq, 1 goods_seq, '항목1-1' title FROM dual
UNION ALL SELECT 1, 1, 2, '항목1-2' FROM dual
UNION ALL SELECT 2, 2, 3, '항목2-1' FROM dual
UNION ALL SELECT 2, 2, 4, '항목2-2' FROM dual
UNION ALL SELECT 3, 3, 5, '항목3-1' FROM dual
UNION ALL SELECT 3, 3, 6, '항목3-2' FROM dual
UNION ALL SELECT 4, 4, 7, '항목4-1' FROM dual
UNION ALL SELECT 4, 4, 8, '항목4-2' FROM dual
)
, t2 AS
(
SELECT 1 epi_seq, 1 content_seq, 'user1' user_key, 1 goods_seq FROM dual
UNION ALL SELECT 1, 1, 'user2', 1 FROM dual
UNION ALL SELECT 1, 1, 'user3', 1 FROM dual
UNION ALL SELECT 1, 1, 'user4', 2 FROM dual
UNION ALL SELECT 2, 2, 'user1', 3 FROM dual
UNION ALL SELECT 2, 2, 'user2', 3 FROM dual
UNION ALL SELECT 2, 2, 'user3', 4 FROM dual
UNION ALL SELECT 2, 2, 'user4', 4 FROM dual
UNION ALL SELECT 3, 3, 'user1', 5 FROM dual
UNION ALL SELECT 3, 3, 'user2', 5 FROM dual
UNION ALL SELECT 3, 3, 'user3', 6 FROM dual
)
SELECT epi_seq
     , content_seq
     , MIN(DECODE(rn, 1, title)) title_1
     , MIN(DECODE(rn, 1, ratio)) ratio_1
     , MIN(DECODE(rn, 2, title)) title_2
     , MIN(DECODE(rn, 2, ratio)) ratio_2
  FROM (SELECT a.epi_seq
             , a.content_seq
             , a.goods_seq
             , a.title
             , ROW_NUMBER() OVER(PARTITION BY a.epi_seq, a.content_seq ORDER BY a.goods_seq) rn
             , ROUND(RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY a.epi_seq, a.content_seq) * 100, 2) ratio
          FROM t1 a
             , t2 b
         WHERE a.epi_seq     = b.epi_seq
           AND a.content_seq = b.content_seq
           AND a.goods_seq   = b.goods_seq
         GROUP BY a.epi_seq, a.content_seq, a.goods_seq, a.title
        )
 GROUP BY epi_seq, content_seq
 ORDER BY epi_seq, content_seq
;

 


by KYoung [2017.06.12 15:59:49]

감사합니다! ㅠㅠ

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