ROLLUP 활용 또는 GROUP BY 활용 그룹별 합계, 총계 구하기 문의 0 3 4,091

by 정진우 [SQL Query] ROLLUP GROUP BY [2014.10.30 15:44:36]


안녕하세요. 오랜만에 인사드립니다.

SQL을 작성하고 있는데 의문이 하나 들어서요. ^^

원하는 결과는 이것입니다.

구분 갯수 합계
A 5 9
B 4 9

 

위와 같은 결과를 얻는 방법에 대해서 궁금해서 질문을 올립니다.

우선 테스트 해본 방법은

WITH T AS(
SELECT "A" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
UNION ALL SELECT "B" PROD FROM DUAL
UNION ALL SELECT "B" PROD FROM DUAL
UNION ALL SELECT "B" PROD FROM DUAL
UNION ALL SELECT "B" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
UNION ALL SELECT "A" PROD FROM DUAL
)

SELECT DISTINCT PROD,
                , COUNT(PROD) OVER() AS ALL
                , COUNT(PROD) OVER(PARTITION BY PROD) AS PART
FROM T

 

위와같이 작성하는 방법으로는 가능한데 이렇게도 사용하는게 맞는지 ..

실제 활용도가 있는 쿼리있지 궁금하기도 하구요.... (Advanced SQL 강좌의 마농님 강좌를 보았습니다.)

저기엔 중복되는 노출을 안하려고 DISTINCT 를 사용했는데요.

ROLLUP을 사용하면

 

SELECT PROD
                , COUNT(PROD)
FORM T
GROUP BY ROLLUP(PROD)

합계부분이 최하단에 위치하자나요 ? 주로 DECODE(PROD, NULL, 'TOT', PROD)이런식으로 사용하구요 .

그런데 화면에 실제보여줘야하는건,   COUNT(PROD) = 소계 값이랑 , 총계 값이 같은 ROW에 보여주어야하거든요.

ROLLUP으로는 불가능한가요 ?? ( COUNT(PROD) OVER(), COUNT(PROD) OVER(PARTITION BY GROUPING_ID(PROD)) ) 이런식으로 다 해보았지만

이미 GROUP BY 절서부터 .. PROD 로 나뉜거라서 총계를 옆에 위치시킬수가 없더라구요.

다르게 조회하는 방법이 있다면 팁좀 알려주시면 감사하겠습니다. ㅠ 

 

by 비주류 [2014.10.30 16:18:09]
-- 집계 내용에 대해 분석 함수를 붙여주시면...
SELECT  PROD, COUNT(PROD) CNT, SUM(COUNT(PROD)) OVER () SUM_CNT
FROM    T
GROUP BY PROD

 


by 정진우 [2014.10.30 17:08:58]

아.. 감사합니다.

이게 아까 이런식으로도 한 번 시도해보았었는데, 

그떄는 오류가 나더라구요 .. 

메시지가 정확히는 기억이 안나지만, 내용이 대충 ..집계합수의 깊이가 너무 #!@#!$ 합니다.

이런식으로요 .. 

코드를 한 번 더 되짚어볼 껄 하는 후회를 하게 되네요.

 

감사합니다 !!


by 마농 [2014.10.31 09:52:38]

COUNT(prod) 도 굳이 컬럼을 명시할 이유가 없어 보입니다.

COUNT(*) 가 성능, 가독성, 간결성 등 여러모로 좋습니다.

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