좀더 간결한 방법을 찾을려고 질문해 봅니다. 쉽지 않을 수 있습니다.
이런 방법도 있을까요?
아래는 DAT라는 테이블이며 필드는 F1, F2가 있습니다.
DAT | |
F1 | F2 |
1 | A |
1 | A |
1 | C |
2 | B |
2 | B |
2 | D |
3 | A |
3 | A |
3 | E |
4 | B |
4 | B |
4 | F |
결과는 밑줄친 부분 아래처럼 결과가 나오길 원하고 있습니다.
GROUP BY F1 | COUNT(DISTINCT F2) | SELECT COUNT(DISTINCT F2) FROM DAT |
1 | 2 | 6 |
2 | 2 | 6 |
3 | 2 | 6 |
4 | 2 | 6 |
단! 아래 SQL을 보시면 서브 쿼리나 인라인 쿼리 제외입니다. 분석함수로 가능할지에 대한 질문입니다.
SELECT F1 , COUNT(DISTINCT F2) , (SELECT COUNT(DISTINCT F2) FROM DAT) <-- 이부분을 분석함수로 가능할지 여부 말입니다 FROM DAT <-- 이부분도 인라인 쿼리 제외입니다. GROUP BY F1
with DAT (F1, F2) as ( select 1, 'A' from dual union all select 1, 'A' from dual union all select 1, 'C' from dual union all select 2, 'B' from dual union all select 2, 'B' from dual union all select 2, 'D' from dual union all select 3, 'A' from dual union all select 3, 'A' from dual union all select 3, 'E' from dual union all select 4, 'B' from dual union all select 4, 'B' from dual union all select 4, 'F' from dual ) select distinct f1 ,count(distinct f2) over(partition by f1) cnt ,count(distinct f2) over() cnt2 from dat order by f1 ;
COUNT(DISTINCT f2) 가 아닌 COUNT(*) 였다면 가능합니다.
SUM(COUNT(*)) OVER()
그러나 DISTINCT 부분 때문에 불가합니다.
SUM(COUNT(DISTINCT f2)) OVER() ===> (8) 원하는 결과가 아님(중복카운트발생)
그룹바이하지 않고, 바로 분석함수 사용하여 Distinct 하면 될 듯. ===> swlee710 님 답변 참조
합계를 컬럼이 아닌 행으로 빼는것은 어떨런지요?
SELECT f1 , COUNT(DISTINCT f2) cnt FROM dat GROUP BY ROLLUP(f1) ;