GROUP BY 절 문의좀 드리겠습니다 ! 0 16 1,607

by 구기웅 GROUP BY GROUPING [2015.07.20 15:55:52]


안녕하세요, 매번 도움만 얻어가는 염치없는 1인 입니다.

다름이 아니라 DATE 로 GROUP BY 절을 사용해야 하는상황인대

일자별로 그룹핑이 된 후 해당 날자의 시간을 그룹핑을 해야하는상황입니다. 도와주세요.

SELECT
	COUNT(REG_SEQ) TM_CNT,
	REG_DT
FROM (
	SELECT
		REG_SEQ,
		TO_CHAR(REG_DT, 'YYYY-MM-DD') AS REG_DT
	FROM TABLE
	GROUP BY REG_SEQ, TO_CHAR(REG_DT, 'YYYY-MM-DD')
)
GROUP BY REG_DT

위의 SQL 결과에 추가로 HH24 가 필요한 경우인데 어떻게 해답이 없을까요?

 

SELECT
	COUNT(REG_SEQ) TM_CNT,
	REG_DT_TM
FROM (
	SELECT
		REG_SEQ,
		TO_CHAR(REG_DT, 'YYYY-MM-DD') AS REG_DT,
		TO_CHAR(REG_DT, 'HH24') AS REG_DT_TM,
	FROM VB_STAT_USERAGENT
	WHERE  REG_DT >= TO_DATE('2015-07-20' || '00:00:00', 'YYYY-MM-DD HH24:MI:SS')
	AND REG_DT <= TO_DATE('2015-07-20' || '23:59:59', 'YYYY-MM-DD HH24:MI:SS') 
	GROUP BY REG_SEQ, TO_CHAR(REG_DT, 'YYYY-MM-DD'),TO_CHAR(REG_DT, 'HH24')
)
GROUP BY REG_DT_TM

이런식으로 추가시 시간이 같이 그룹핑이 되어서 제가 원하는 데이터 결과물에 시간대별의 로우가 추가로 생기는 문제때문에 해결을 못하고 있습니다.ㅜㅜ

 

죄송합니다.

원하는 데이터 결과 로우는

TM_CNT REG_DT_TM
2 08
4 09
2 10
3 11
1 14
7 17


이런식의 결과가 필요합니다. 

해당 결과를 나타내기위한 조건은

1. REG_SEQ 가 같은 날에 중복이 되지 않아야 합니다

2. REG_DT_TM 해당 날자의 시간이 필요합니다.

 

by 마농 [2015.07.20 16:13:10]

원하시는 결과물이 무엇인지? 모호하네요.
원하시는 결과예시를 표형태로 만들어 보여주세요.


by 구기웅 [2015.07.20 16:29:49]

게시글에 수정해서 올려 놓았습니다 ! 


by 마농 [2015.07.20 16:31:45]

결과물을 올리셨는데요. 또, 이해가 안가는데요. ㅎㅎ
기존 질문과 전혀 매칭되지 않는 새로운 결과물이네요.


원래 올리신 질문엔 reg_seq 없이 Count 했는데.
올리신 결과물은 reg_seq 가 있고 Count 는 없네요?
그냥 DISTINCT 하면 되는 것 아닌지요?

SELECT DISTINCT reg_seq
     , TO_CHAR(reg_dt, 'yyyy-mm-dd') reg_dt
     , TO_CHAR(reg_dt, 'hh24') reg_dt_tm
  FROM t
 WHERE 조건
;


원본자료가 어떻길래 해당 결과가 나오나요?
원본 예시도 보여주세요.


by 구기웅 [2015.07.20 16:44:31]
SELECT
*
FROM (
	SELECT
		DISTINCT REG_SEQ,
		REG_DT_TM
	FROM (
		SELECT
			REG_SEQ,
			TO_CHAR(REG_DT, 'YYYY-MM-DD') AS REG_DT,
			TO_CHAR(REG_DT, 'HH24') AS REG_DT_TM
		FROM VB_STAT_USERAGENT
		WHERE  REG_DT >= TO_DATE('2015-07-20' || '00:00:00', 'YYYY-MM-DD HH24:MI:SS')
		AND REG_DT <= TO_DATE('2015-07-20' || '23:59:59', 'YYYY-MM-DD HH24:MI:SS') 
		GROUP BY REG_SEQ, TO_CHAR(REG_DT, 'YYYY-MM-DD'), TO_CHAR(REG_DT, 'HH24')
		ORDER BY REG_SEQ
	)
GROUP BY REG_DT_TM, REG_SEQ
)

이런식으로 처리시 결과가

REG_SEQ REG_DT_TM
A 12
B 10
B 12
C 13

이런식의 결과가 나오게 되는대요

REG_DT_TM 이 다르더라도 REG_SEQ 는 1개의 로우만 필요한상황입니다.

그걸 최종적으로 COUNT 로 묶게 되면 제가 원하는 결과가 될거 같습니다.


by jkson [2015.07.20 17:00:28]
 SELECT
        COUNT(REG_SEQ) CNT,
        TO_CHAR(REG_DT, 'YYYY-MM-DD') AS REG_DT,
        TO_CHAR(REG_DT, 'HH24') AS REG_DT_TM,
   FROM VB_STAT_USERAGENT
  WHERE REG_DT >= TO_DATE('2015-07-20' || '00:00:00', 'YYYY-MM-DD HH24:MI:SS')
    AND REG_DT <= TO_DATE('2015-07-20' || '23:59:59', 'YYYY-MM-DD HH24:MI:SS') 
  GROUP BY TO_CHAR(REG_DT, 'YYYY-MM-DD'),TO_CHAR(REG_DT, 'HH24')

그냥 시간대별 카운트가 필요하신 거 아닌가요?

REG_DT_TM이 다르더라도 REG_SEQ가 1개의 로우만 필요하다는 말씀이??

한글로 설명하시지 마시고 그냥 표로 기본 데이터 -> 결과 데이터 이런 식으로 보여주시는 게

나을 듯합니다만


by 구기웅 [2015.07.20 18:03:42]

혼란을 드려 대단히 죄송합니다.

질문에 대한 결과를 원하는 답변을 달아놓았으니 확인 부탁드립니다. 


by 마농 [2015.07.20 17:01:44]
-- 건수의 이미가 또 헷갈리네요.
-- 단순 건수인지? 시간대별 중복이 제거된 건수인지?
SELECT reg_seq
     , TO_CHAR(reg_dt, 'yyyy-mm-dd') reg_dt
     , TO_CHAR(MAX(reg_dt), 'hh24') reg_dt_tm
     , COUNT(*) cnt1
     , COUNT(DISTINCT TRUNC(reg_dt, 'hh')) cnt2
  FROM t
 WHERE 조건
 GROUP BY reg_seq
     , TO_CHAR(reg_dt, 'yyyy-mm-dd')
;

 


by 구기웅 [2015.07.20 17:34:48]

죄송합니다 . 말로 설명 하려고 하니 잘안되는군요 우선 REG_SEQ가 같은날자 여러 시간대에 포함되어 있다고 하더라도

같은날자에는 COUNT를 1개로 보여주는 결과가 필요합니다.ㅠ


by jkson [2015.07.20 17:41:23]

REG_SEQ가 같은날자 여러 시간대에 포함되어 있다고 하더라도

같은날자에는 COUNT를 1개로 보여주는 결과가 필요합니다.

-> 시간 별 카운트라는 말 아닌가요?

reg_dt, reg_seq 가 다음과 같을 때 결과가 어떻게 나와야 하나요?

7월20일 08시 20분, 1

7월20일 08시 25분, 2

7월20일 09시 30분, 3

7월20일 10시 15분, 4

7월20일 11시 10분, 5

7월20일 11시 55분, 6

------------------------

위에 글 다시 쭉 읽어보니 reg_seq가 하루에도 여러개가 중복되기도 하나보네요?

보다보니 퇴근시간이네요. 

질문하시는 분이 약간 번거로우시더라도

원본데이터표, 결과데이터표, 설명 추가 요렇게 해주시면

답변하는 분들이 금방 이해가 될 거예요. 하루 수고하셨음다~~ 


by 마농 [2015.07.20 17:42:14]
SELECT reg_seq
     , TO_CHAR(reg_dt, 'yyyy-mm-dd') reg_dt
     , TO_CHAR(MAX(reg_dt), 'hh24') reg_dt_tm
     , 1 AS cnt    -- 요렇게요???
  FROM t
 WHERE 조건
 GROUP BY reg_seq
     , TO_CHAR(reg_dt, 'yyyy-mm-dd')
;

 


by 마농 [2015.07.20 17:44:27]

제가 질문을 한 이유는
명확하지 않은 질문을 명확하게 완성하기 위함인데요.
추상화 단편화된 질문을 구체화하고 통합시키기 위함인데요.
제 질문에 답하실 때마다 점점 더 미궁에 빠지네요.
원본 따로, 결과 따로, 질문 따로...


글로만 하는 질문은 모호성을 가집니다.
말로만 해서 전달이 잘 안되는것을 스스로도 느끼고 계시네요.
확실하게 자료 예시를 보여주시면 질문이 이해가 빠르고요
원본 대비 결과도 연결성이 있게 해주시면 빠른 도움 받으실 수 있습니다.


by 구기웅 [2015.07.20 17:52:11]
reg_seq reg_dt
A1 2015-06-01 03:45:24
A1 2015-06-01 04:45:24
B1 2015-06-01 05:45:24
B1 2015-06-01 05:45:24
C1 2015-06-01 13:45:24
C1 2015-06-01 05:45:24
D1 2015-06-01 13:45:24
D1 2015-06-01 14:45:24
D1 2015-06-01 14:45:24

위처럼 데이터가 저장되고 있습니다.

데이터는 계속 쌓이고 있으며 해당 데이터에 대한 결과를 보여주고 싶은거는

 


 

CNT TM
1 03
2 05
1 13
   

입니다. 이렇게 되면 조금 이해하시기 쉬우실까요.? 죄송합니다 혼란을 많이 드린거 같아서


by 마농 [2015.07.20 17:57:03]
-- 켁~ 결국 전혀 다른 새로운 질문이 나왔네요.
-- 원본 대비 결과로 질문하시니 완전 이해됩니다.
SELECT COUNT(DISTINCT reg_seq) reg_cnt
     , TO_CHAR(reg_dt, 'hh24') reg_dt_tm
  FROM t
 WHERE 조건
 GROUP BY TO_CHAR(reg_dt, 'hh24')
;

 


by 구기웅 [2015.07.20 18:00:54]

혼란드려 죄송합니다.

마농님 죄송하지만 결과를 원하는 표를 한번더 확인해주시면 감사할거 같습니다.


by 마농 [2015.07.20 18:04:54]
-- 헉... 답변 다는 사이 결과가 바뀌었네요. 질문을 신중하게....
SELECT COUNT(*) reg_cnt
     , reg_dt_tm
  FROM (SELECT reg_seq
             , TO_CHAR(MIN(reg_dt), 'hh24') reg_dt_tm
          FROM t
         WHERE 조건
         GROUP BY reg_seq
        )
 GROUP BY reg_dt_tm
;

 


by 구기웅 [2015.07.20 18:16:04]

죄송합니다. 마농님, 또 질문에 혼란을 드려 죄송합니다.

마농님 덕분에 하루죙일 싸매고 안되던게 해결됬습니다. 대단히 감사합니다 ㅠ

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