통계 질문 0 4 1,731

by 그루비 [SQL Query] 통계 추출 PIVOT [2018.11.09 17:54:58]


질문유형 평가자유형 대상자ID 대상자 이름 평가자 ID 평가자 이름 점수
1 A 87 이순재 191 송태섭 3
1 A 87 이순재 274 이병진 4
1 B 87 이순재 138 박명수 2
1 B 87 이순재 291 손승근 3
1 C 87 이순재 510 김종필 3
1 C 87 이순재 1270 박형욱 3
2 A 87 이순재 191 송태섭 3
2 A 87 이순재 274 이병진 4
2 B 87 이순재 291 손승근 3
2 B 87 이순재 138 박명수 3
2 C 87 이순재 1270 박형욱 4
2 C 87 이순재 510 김종필 5
3 A 87 이순재 191 송태섭 4
3 A 87 이순재 274 이병진 5
3 B 87 이순재 291 손승근 4
3 B 87 이순재 138 박명수 5
3 C 87 이순재 510 김종필 4
3 C 87 이순재 1270 박형욱 3
4 A 87 이순재 274 이병진 5
4 A 87 이순재 191 송태섭 2
4 B 87 이순재 291 손승근 2
4 B 87 이순재 138 박명수 5
4 C 87 이순재 1270 박형욱 4
4 C 87 이순재 510 김종필 5

 

위 데이터로 통계를 하려고 합니다.

 

질문유형   송태섭 이병진 평균 박명수 손승근 평균 김종필 박형욱 평균
1 이순재 3 4 3.5 2 3 2.5 3 3 3
2 이순재 3 4 3.5 3 3 3 5 4 4.5
3 이순재 4 5 4.5 5 4 4.5 4 3 3.5
4 이순재 2 5 3.5 5 2 3.5 5 4 4.5

최종 그림은 대상자를 평가한 평가자들 점수를 평균을 내는게 목표인데

도통 합치는게 그려지지 않아 이렇게 도움을 청합니다.

 

이걸 피벗으로 나태낼수 있나요?

평가자가 동적인 경우 어떡해 되야 할지도 궁금합니다.

by 마농 [2018.11.12 12:31:30]

피벗 쿼리는 열에 표시할 정보(개수 및 값)가 고정일 때만 사용할 수 있습니다.
가변일 경우엔 동적쿼리를 이용하셔야 합니다.

WITH t(질문유형, 평가자유형, 대상자ID, 대상자이름, 평가자ID, 평가자이름, 점수) AS
(
          SELECT 1, 'A', 87, '이순재',  191, '송태섭', 3 FROM dual
UNION ALL SELECT 1, 'A', 87, '이순재',  274, '이병진', 4 FROM dual
UNION ALL SELECT 1, 'B', 87, '이순재',  138, '박명수', 2 FROM dual
UNION ALL SELECT 1, 'B', 87, '이순재',  291, '손승근', 3 FROM dual
UNION ALL SELECT 1, 'C', 87, '이순재',  510, '김종필', 3 FROM dual
UNION ALL SELECT 1, 'C', 87, '이순재', 1270, '박형욱', 3 FROM dual
UNION ALL SELECT 2, 'A', 87, '이순재',  191, '송태섭', 3 FROM dual
UNION ALL SELECT 2, 'A', 87, '이순재',  274, '이병진', 4 FROM dual
UNION ALL SELECT 2, 'B', 87, '이순재',  291, '손승근', 3 FROM dual
UNION ALL SELECT 2, 'B', 87, '이순재',  138, '박명수', 3 FROM dual
UNION ALL SELECT 2, 'C', 87, '이순재', 1270, '박형욱', 4 FROM dual
UNION ALL SELECT 2, 'C', 87, '이순재',  510, '김종필', 5 FROM dual
UNION ALL SELECT 3, 'A', 87, '이순재',  191, '송태섭', 4 FROM dual
UNION ALL SELECT 3, 'A', 87, '이순재',  274, '이병진', 5 FROM dual
UNION ALL SELECT 3, 'B', 87, '이순재',  291, '손승근', 4 FROM dual
UNION ALL SELECT 3, 'B', 87, '이순재',  138, '박명수', 5 FROM dual
UNION ALL SELECT 3, 'C', 87, '이순재',  510, '김종필', 4 FROM dual
UNION ALL SELECT 3, 'C', 87, '이순재', 1270, '박형욱', 3 FROM dual
UNION ALL SELECT 4, 'A', 87, '이순재',  274, '이병진', 5 FROM dual
UNION ALL SELECT 4, 'A', 87, '이순재',  191, '송태섭', 2 FROM dual
UNION ALL SELECT 4, 'B', 87, '이순재',  291, '손승근', 2 FROM dual
UNION ALL SELECT 4, 'B', 87, '이순재',  138, '박명수', 5 FROM dual
UNION ALL SELECT 4, 'C', 87, '이순재', 1270, '박형욱', 4 FROM dual
UNION ALL SELECT 4, 'C', 87, '이순재',  510, '김종필', 5 FROM dual
)
SELECT 질문유형
     , 대상자이름
     , AVG(CASE WHEN 평가자유형 = 'A' AND 평가자ID =  191 THEN 점수 END) A_송태섭
     , AVG(CASE WHEN 평가자유형 = 'A' AND 평가자ID =  274 THEN 점수 END) A_이병진
     , AVG(CASE WHEN 평가자유형 = 'A'                     THEN 점수 END) A_평균
     , AVG(CASE WHEN 평가자유형 = 'B' AND 평가자ID =  138 THEN 점수 END) B_박명수
     , AVG(CASE WHEN 평가자유형 = 'B' AND 평가자ID =  291 THEN 점수 END) B_손승근
     , AVG(CASE WHEN 평가자유형 = 'B'                     THEN 점수 END) B_평균
     , AVG(CASE WHEN 평가자유형 = 'C' AND 평가자ID =  510 THEN 점수 END) C_김종필
     , AVG(CASE WHEN 평가자유형 = 'C' AND 평가자ID = 1270 THEN 점수 END) C_박형욱
     , AVG(CASE WHEN 평가자유형 = 'C'                     THEN 점수 END) C_평균
  FROM t
 WHERE 대상자ID = 87
 GROUP BY 대상자ID, 대상자이름, 질문유형
 ORDER BY 대상자ID, 대상자이름, 질문유형
;

 


by 그루비 [2018.11.12 13:35:58]

동적쿼리를 이용을 해야하는 군요...


by 그루비 [2018.11.13 09:57:57]

고정값으로 평가자ID가 바뀐다고 하면 어떡해 해야 할까요?


by 마농 [2018.11.13 12:25:00]

피벗(행을 열로)을 하려면 항목의 개수와 값들이 이미 정해져 있어야 합니다.
고정값이 아니라면 정적SQL 로는 어렵습니다.
여러가지 형태의 대안을 생각하셔야 합니다.
- 동적쿼리
- 최대 개수만큼 항목 나열하기, 순번 부여하여 피벗
- listagg 로 한컬럼에 몰아넣기
- 프로그램에서 피벗하기
- 등등등...

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