Oracle Rollup 에서 row가 1개일 경우 제거하는 법... 1 6 1,899

by 열정가이 [SQL Query] [2019.04.01 20:06:16]


image.PNG (63,606Bytes)
image2.PNG (35,032Bytes)

안녕하세요, 초보개발자입니다.

쿼리 관련해서 질문이 있는데요, 사진처럼 데이터를 뽑았습니다.

쿼리는 대략적으로 아래와 같습니다.

SELECT 
  DECODE( GROUPING_ID( test, TIMESTAMP ) , 1, test || '', 3, '총합계', test )                                            AS test ,
  DECODE( GROUPING_ID( test, TIMESTAMP ) , 1, '소계', 3, '', TIMESTAMP )                                                      AS TIMESTAMP ,
  ....
  )
GROUP BY rollup(test,TIMESTAMP)

 

이때 GROUP BY 밑에 Having을 이용해서 TIMESTAMP 값이 1개일 때는 소계가 안나오게 할 수 없을까요?

2번째 image와 같이 TIMESTAMP 값이 2개일때는 소계를 뽑아내지만, 첫번째 사진과 같이 'TIMESTASMP 값이 1개' 일 때는

소계를 보여주고 싶지 않습니다 ㅠ

어떤 방법이 있을까요.. HAVING절에서 처리하는 방법이요...!!ㅠ

감사합니다..!

by 마농 [2019.04.02 08:11:18]
-- "1개 일 때는 소계를 보여주고 싶지 않다." 를 그대로 조건절에 넣어 주시면 됩니다.
--  1개 일 때 : COUNT(*) = 1
--  소계 : GROUPING_ID(test, timestamp) = 1
--  보여주고 싶지 않다. : NOT
 HAVING NOT (COUNT(*) = 1 AND GROUPING_ID(test, timestamp) = 1)
-- NOT 을 안으로 풀어서 넣으면
 HAVING COUNT(*) != 1 OR GROUPING_ID(test, timestamp) != 1

 


by 열정가이 [2019.04.02 17:14:34]

COUNT(*) 을 하게 되면 (TEST, TIMESTAMP)로 묶인 로우의 개수가 1일때지 않나요?

저는 GROUP을 묶은 다음 나온 ROW가 1개 일때를 제외하고 싶거든요 ㅠ


by 마농 [2019.04.02 17:20:28]

롤업은 그룹바이 기준별 합계와 단계별 소계를 한번에 해주는 구문이죠.
COUNT(*) 는 기준별 합계에만 적용되는게 아니라 소계와 전체합계에도 마찬가지로 적용됩니다.
머리속으로만 고민하고 댓글부터 달지 마시고
우선 실행후 결과를 분석해본 뒤에 댓글을 다는 것이 좋습니다.


by 열정가이 [2019.04.03 09:19:17]

제가 여쭙고 싶은건 TIMESTAMP가 14,15 일 처럼 2개에 대한 소계가 아닌, 14일 처럼 한개에 대한 소계일 경우 

제외하고 싶었습니다. 원본 데이터는 14일에 대한 데이터가 수많은 데이터가 있기 때문에 COUNT(*)을 해도 1이 아닌 14일로 묶인 로우의 개수가 출력되게 되구요.

제가 질문을 잘못 올린것 같네요 죄송합니다. 머리속으로 고민하만 올린 결과가 아닌 분석해보고 말씀드린 결과라는 것만 알아주시면 좋겠네요. 고생하세요.


by 마농 [2019.04.03 09:39:11]

아!. 그러네요.
제가 잘못 생각했네요.
COUNT(*) 대신 COUNT(DISTINCT timestamp) 로 바꾸시면 됩니다.

WITH t AS
(
SELECT 'AAA' test, '2018-11-14' timestamp FROM dual
UNION ALL SELECT 'AAA', '2018-11-14' FROM dual
UNION ALL SELECT 'BBB', '2018-11-14' FROM dual
UNION ALL SELECT 'BBB', '2018-11-14' FROM dual
UNION ALL SELECT 'CCC', '2018-11-14' FROM dual
UNION ALL SELECT 'CCC', '2018-11-14' FROM dual
UNION ALL SELECT 'CCC', '2018-11-15' FROM dual
)
SELECT NVL(test, '총합계') test
     , DECODE(GROUPING_ID(test, timestamp), 0, timestamp, 1, '소계') timestamp
     , COUNT(*) cnt
  FROM t a
 GROUP BY ROLLUP(test, timestamp)
 HAVING NOT (COUNT(DISTINCT timestamp) = 1 AND GROUPING_ID(test, timestamp) = 1)
 ORDER BY a.test, a.timestamp
;

 


by 열정가이 [2019.04.03 09:54:28]

정말 감사합니다...!! DISTINCT를 이렇게 사용하는 방법은 몰랐네요...!!

좋은 하루 보내세요!!

 

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