WITH t(컬럼A, 컬럼B) AS ( SELECT '비둘기' , 10 FROM dual UNION ALL SELECT '비둘기', 20 FROM dual UNION ALL SELECT '비둘기', 30 FROM dual UNION ALL SELECT '참새', 20 FROM dual UNION ALL SELECT '참새', 30 FROM dual UNION ALL SELECT '참새', 40 FROM dual ) SELECT listagg(컬럼A || 컬럼B, ', ') within GROUP(ORDER BY 컬럼A) 컬럼 FROM ( SELECT 컬럼A, MAX(컬럼B) 컬럼B FROM t GROUP BY 컬럼A )
1. With 문은 테스트용으로 샘플 만든거 정도라고 생각하시면 됩니다.
- 다 적어가면서 union 하라는 의미가 아닙니다.
- with 문 무시하시고 select 를 어떤 식으로 작성했는지를 보시면 됩니다.
2. Listagg 는
- group by 에서 문자열 합칠 때 사용합니다.
- 질문이 모호한데 이걸 원하시는게 아닌 듯 합니다.
- 단순 group by 를 원하시는게 아닐런지?
- "중복값 제거후 큰값" 이란 표현보다는 "a 별 b의 최대값" 이란 표현이 좋을 듯.
- group by 는 중복제거용이 아니라 집계용입니다. 중복제거는 distinct
3. over 는 분석함수 구문입니다.
- 집계함수와 분석함수는 집계를 한다는 점에서 유사합니다만
- 결과를 표현하는 방법에서 큰 차이가 있습니다.
- 분석함수를 사용할 때와 집계함수를 사용할 때를 구별해야 합니다.
SELECT 컬럼a , MAX(컬럼b) 컬럼b FROM t GROUP BY 컬럼a ORDER BY 컬럼a ;