by 수달 [2024.04.01 17:35:29]
사진과 같이, 한 컬럼의 특정 값(설문항목 컬럼 내 A, B, C)을 새로운 열로 생성하여 응답값을 나타내고 싶습니다.
A, B, C 각각 추출한 쿼리를 WITH절로 묶은 다음, 조인하는 방법 밖에 찾지 못했는데 그러다보니 너어무 쿼리 돌리는데 오래 걸리더라구요ㅠㅠ
혹시 좋은 방법 있을지 문의 드립니다.
WITH t AS
(
SELECT 1 id, 'A' q, 5 a FROM dual
UNION ALL SELECT 1, 'B', 6 FROM dual
UNION ALL SELECT 1, 'C', 7 FROM dual
UNION ALL SELECT 1, 'D', 1 FROM dual
UNION ALL SELECT 1, 'E', 5 FROM dual
UNION ALL SELECT 1, 'F', 9 FROM dual
UNION ALL SELECT 1, 'G', 8 FROM dual
UNION ALL SELECT 1, 'H', 2 FROM dual
UNION ALL SELECT 1, 'I', 1 FROM dual
UNION ALL SELECT 1, 'J', 2 FROM dual
UNION ALL SELECT 2, 'A', 8 FROM dual
UNION ALL SELECT 2, 'B', 2 FROM dual
UNION ALL SELECT 2, 'C', 3 FROM dual
UNION ALL SELECT 2, 'D', 2 FROM dual
UNION ALL SELECT 2, 'E', 1 FROM dual
UNION ALL SELECT 2, 'F', 8 FROM dual
UNION ALL SELECT 2, 'G', 2 FROM dual
UNION ALL SELECT 2, 'H', 9 FROM dual
UNION ALL SELECT 2, 'I', 1 FROM dual
UNION ALL SELECT 2, 'J', 5 FROM dual
UNION ALL SELECT 3, 'A', 8 FROM dual
UNION ALL SELECT 3, 'B', 7 FROM dual
UNION ALL SELECT 3, 'C', 1 FROM dual
UNION ALL SELECT 3, 'D', 9 FROM dual
UNION ALL SELECT 3, 'E', 3 FROM dual
UNION ALL SELECT 3, 'F', 7 FROM dual
UNION ALL SELECT 3, 'G', 5 FROM dual
UNION ALL SELECT 3, 'H', 8 FROM dual
UNION ALL SELECT 3, 'I', 6 FROM dual
UNION ALL SELECT 3, 'J', 1 FROM dual
)
-- 1. Group By ~ Min(Decode())
SELECT id
, MIN(DECODE(q, 'A', a)) a
, MIN(DECODE(q, 'B', a)) b
, MIN(DECODE(q, 'C', a)) c
FROM t
WHERE q IN ('A', 'B', 'C')
GROUP BY id
;
-- 2. PIVOT
SELECT *
FROM t
PIVOT (MIN(a) FOR q IN ('A' a, 'B' b, 'C' c))
;
와 감사합니다! 혹시 MIN을 쓰는 이유를 알 수 있을까요?(MAX나 SUM이 아닌)
어차피 조건에 해당하는 것은 1건 뿐이므로 MIN/MAX 뭘 쓰든 상관 없습니다.
SUM, AVG 등은 숫자인 경우에는?가능하긴 합니다만...
이 경우에는 수치계산이 아니므로 그냥 MIN/MAX 가 적당합니다.