테이블 정보
컨텐츠 | 투표항목 | 투표 |
EPI_SEQ(PK) CONTENT_SEQ(PK) |
EPI_SEQ(PK) |
EPI_SEQ(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 입니다.
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 ;