총 합을 분석함수가능할까요 0 4 1,842

by 허승호 [SQL Query] [2016.03.15 14:18:24]


좀더 간결한 방법을 찾을려고 질문해 봅니다. 쉽지 않을 수 있습니다. 

이런 방법도 있을까요? 

아래는 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

 

by swlee710 [2016.03.15 14:46:11]
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
;

 


by 허승호 [2016.03.15 16:18:32]

swlee710님 감사합니다.^^


by 마농 [2016.03.15 14:54:23]

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)
;

 


by 허승호 [2016.03.15 16:30:21]

오~ ROLLUP 결과란에 표시 되는군요. 요건 몰랐습니다. ㅋㅋ

매년마다 기관에서 요청한 통계자료 작성하느라

재사용할려고 좀 더 이해하기 쉬운 코드 만들려고 하다보니 이렇게 되었네요. 

감사합니다. ^^

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