database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29638 게시물 읽기
No. 29638
안녕하세요 mysql질문입니다.
작성자
투루로맨스(jung1873)
작성일
2010-05-07 13:51ⓒ
2010-05-07 13:55ⓜ
조회수
7,974

안녕하세요 mysql 쿼리질문 입니다.

 

쿼리는

 select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee, 
 date_format(C.Connect, '%Y-%m-%d') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId) 
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-01')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars
  
   GROUP BY connDate order by NULL

 

 

 

결과값은

 

 

duration dosu fee connDate
9288 317 634000 2010-05-01
9302 315 630000 2010-05-02
9695 329 658000 2010-05-03
20783 735 1470000 2010-05-04
41214 1389 2778000 2010-05-05


 

 

이런식으로 나오고 있습니다.

connDate 가 날짜별로 그룹으로 묶어서 + / - 연산해서 나온값입니다.

 

여기서 질문은

현재 connDate는 데이터 타입으로 2010-04-29 09:32:29

이런식으로 저장되어 있습니다.

위에서는 date_format(C.Connect, '%Y-%m-%d') as connDate
이렇게 한후 그룹바이로 묶어서 날짜별로 나오고 있습니다.

 

제가 원하는 결과물은

 

날짜가 아닌 당일날짜 시간대 별로 그룹으로 묶어서 나타나게 하는 겁니다.

 

(결과물)

 

duration dosu fee connDate
9288 317 634000 09:00
9302 315 630000 10:00
9695 329 658000 11:00
20783 735 1470000 12:00
41214 1389 2778000 13:00


 

 

위의 조건은 09:00시 대에 몇건의 duration,dosu,fee 가 축적되었는지

                   10:00  시 대에 몇건의 duration,dosu,fee 가 축적되었는지

 

나타나는 겁니다.

이게 쿼리로 만들려고 하니 엄두가 안나서요...

 

위의 부분을 응용해서 만들면 될꺼 같은데 제가 워낙 초보라서요..

 

고수님들 한수 부탁드립니다.

이 글에 대한 댓글이 총 9건 있습니다.

안녕하세요 박성원입니다. ^^

 

ㅎㅎ 여기서도 문의를 올리셨네요 ㅋ

답변은 지식in에 올려뒀습니다. 내용은

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

안녕하세요 ^^

 

쿼리가 매우 난해하길래 좀 보고잇엇는데 질문은 쿼리에 대한 내용이 아니네요 ^0^

 

dateformat 함수는

 

datetime의 'YYYY-MM-DD hh:mm:ss'의 형식에서 특수한 것만 뽑아오는 일종의 함수입니다.

 

즉,

 

datetime(dtime,'%h:%i:%s')

 

이런식으로 하면 시간만으로 출력됩니다. ^^

 

 

기타 다른 부분을 확인하실려면 아래의 URL이 도움이 될듯합니다.

 

http://dev.alseom.co.kr/28

 

 

박성원(darkancia)님이 2010-05-07 14:09에 작성한 댓글입니다.

안녕하세요 박성원님~~

일단 지식인에서의 답변은 감사드립니다.

제가 sql 정식으로 시작한지 얼마 안돼서요..
한수 부탁드려도 될까요??
쿼리는 제가 질문 드린 쿼리에서응용하면 될꺼 같은데 저는 도저히 안되서요...
 

죄송합니다.

투루로맨스(jung1873)님이 2010-05-07 14:13에 작성한 댓글입니다.
이 댓글은 2010-05-07 14:17에 마지막으로 수정되었습니다.

ㅎㅎ

사실 Table이나 머 이런것들을 좀 봐야할듯한데요 ;;

우선 제시해주신 쿼리는 그렇게 좋은 쿼리가 아닙니다.  함수를 너무 많이 쓰셔서 ㅋㅋ

 

어찌댓건 원하는데로 하시는건 언듯보기엔 간단할듯한데요

 

select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee, 
 date_format(C.Connect, '%h:%i:%s') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId) 
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-01')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars

 

위에서처럼 빨간색 부분만 바꾸시면 될듯합니다 ^^

 

해보시고 안되면 다시 댓글릴레이~~ ㅋ

박성원(darkancia)님이 2010-05-07 14:24에 작성한 댓글입니다.

아 눈물나게 감사드립니다.

쿼리는 맞는거 같은데

connDate 이부분이

 

select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee,
 date_format(C.Connect, '%h:%i:%s') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId)
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-05')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars
Group by connDate

(결과)

duration dosu fee connDate
1309 44 88000 01:37:48
1277 43 86000 01:38:17
1310 44 88000 01:38:42
1288 43 86000 04:02:05
1153 39 78000 04:09:28
1284 43 86000 05:51:28
1314 44 88000 06:23:14
1308 44 88000 08:30:37
28 1 2000 08:30:44
1307 44 88000 08:31:16
1334 45 90000 08:31:43
1309 44 88000 08:31:46
1168 39 78000 08:32:21
1286 43 86000 08:33:30
90 3 6000 08:35:10
1291 44 88000 08:36:51
1075 36 72000 08:40:54
1310 44 88000 08:52:20
7 1 2000 09:03:57
740 25 50000 09:05:44
1304 44 88000 09:07:16
95 4 8000 09:15:42
1307 44 88000 09:18:43
1104 37 74000 09:20:21
1254 42 84000 09:28:54
1271 43 86000 09:30:19
1296 44 88000 09:30:40
1329 45 90000 09:39:19
1271 43 86000 09:41:41
1299 44 88000 09:50:27
1319 44 88000 09:55:31
1274 43 86000 10:34:36
898 30 60000 11:18:41
1293 44 88000 11:22:00
1308 44 88000 11:29:50
1320 44 88000 11:38:19
1084 37 74000 11:49:08

 

실행해보니 이렇게 나옵니다.

해당 5월5일 시간별 데이타를 나오는 쿼리입니다.

초까지는 나올필요 없고

connDate 이부분은

11시 대가

898 30 60000 11:18:41
1293 44 88000 11:22:00
1308 44 88000 11:29:50
1320 44 88000 11:38:19
1084 37 74000 11:49:08

이렇게 된다면 오른쪽 connDate 가 11:00로 그룹으로 묶이는 겁니다.

만약

11:49분이라면 11:00

이렇게 정의 해야 하고

만약 9시대 데이터도 있다면

7 1 2000 09:03:57
740 25 50000 09:05:44
1304 44 88000 09:07:16
95 4 8000 09:15:42
1307 44 88000 09:18:43
1104 37 74000 09:20:21
1254 42 84000 09:28:54
1271 43 86000 09:30:19
1296 44 88000 09:30:40
1329 45 90000 09:39:19
1271 43 86000 09:41:41
1299 44 88000 09:50:27
1319 44 88000 09:55:31

이건 9:00로 그룹으로 묶여야 합니다.

connDate이부분이 만약 11:49:08 이라면 11:00 에 속한거며

09:55:31 이라면 9:00 속하는 겁니다.

제가 원하는 결과값은

duration dosu fee connDate
9시대합산 9시대합산 9시대합산 09:00
10시대합산 10시대합산 10시대합산 10:00
11시대합산 11시대합산 11시대합산 11:00
12시대합산 12시대합산 12시대합산 12:00
13시대합산 13시대합산 13시대합산 13:00
14시대합산 14시대합산 14시대합산 14:00
15시대합산 15시대합산 15시대합산 15:00
16시대합산 16시대합산 16시대합산 16:00

17:00~24:00까지 쭉

이런식으로 합산이 되야 합니다..

좀 복잡하죠??^^;;

 

투루로맨스(jung1873)님이 2010-05-07 14:44에 작성한 댓글입니다.

ㅎㅎ 회의다녀왔어요~

 

흠.. 그렇다면

 

select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee, 
 date_format(C.Connect, '%h:%i') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId) 
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-01')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars

 

요렇게 하시면될듯하네요 ^^

박성원(darkancia)님이 2010-05-07 15:33에 작성한 댓글입니다.

아 또한번 감사드립니다.^^

그런데..

select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee,
 date_format(C.Connect, '%h:%i') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId)
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-01')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars
Group by connDate

 

(결과)

duration dosu fee connDate
187 7 14000 01:14
1309 44 88000 01:37
2587 87 174000 01:38
1062 36 72000 01:44
830 30 60000 01:49
287 11 22000 01:50
184 7 14000 01:51
158 6 12000 01:52
373 14 28000 01:53
61 3 6000 01:55
243 9 18000 01:56
242 9 18000 01:58
276 10 20000 02:10
276 10 20000 02:11
275 10 20000 02:24
278 10 20000 02:27
207 7 14000 02:30
269 9 18000 02:53
27 1 2000 03:10
280 10 20000 03:15
1045 35 70000 03:22
38 2 4000 03:25
22 1 2000 03:27
1288 43 86000 04:02
2 1 2000 04:04
1153 39 78000 04:09
2133 72 144000 04:28
1 1 2000 04:31
1284 43 86000 05:51
1082 37 74000 06:11
1010 34 68000 06:14
727 25 50000 06:16
1314 44 88000 06:23
1073 36 72000 07:33
998 34 68000 08:15
746 25 50000 08:19
729 25 50000 08:21
1049 35 70000 08:24
1336 45 90000 08:30
3950 133 266000 08:31
1168 39 78000 08:32
1286 43 86000 08:33
1169 39 78000 08:35
1291 44 88000 08:36
1075 36 72000 08:40
1079 36 72000 08:47
1310 44 88000 08:52
7 1 2000 09:03
740 25 50000 09:05
1304 44 88000 09:07
95 4 8000 09:15
1307 44 88000 09:18
763 26 52000 09:19
1104 37 74000 09:20
1254 42 84000 09:28
2567 87 174000 09:30
796 27 54000 09:32
2114 71 142000 09:33
1329 45 90000 09:39
1271 43 86000 09:41
1299 44 88000 09:50
1319 44 88000 09:55
78 3 6000 10:17
1813 63 126000 10:19
3359 116 232000 10:20
1788 63 126000 10:21
715 25 50000 10:22
1374 47 94000 10:23
56 2 4000 10:26
354 12 24000 10:29
371 13 26000 10:31
372 13 26000 10:32
1274 43 86000 10:34
370 13 26000 10:35
420 15 30000 10:38
376 13 26000 10:40
38 2 4000 10:41
325 11 22000 10:43
333 12 24000 10:45
327 11 22000 10:46
370 13 26000 10:53
348 12 24000 10:55
36 2 4000 11:00
349 12 24000 11:03
367 13 26000 11:08
367 13 26000 11:09
331 12 24000 11:11
362 13 26000 11:13
1076 36 72000 11:16
1188 40 80000 11:18
2405 82 164000 11:22
1308 44 88000 11:29
1078 36 72000 11:34
727 25 50000 11:36
9 1 2000 11:37
2422 82 164000 11:38
1055 36 72000 11:39
1084 37 74000 11:49
354 12 24000 11:52
363 13 26000 11:58
376 13 26000 12:05
1051 36 72000 12:17
364 13 26000 12:28
1413 48 96000 12:30
333 12 24000 12:35
278 10 20000 12:45
1087 37 74000 12:59

이렇게 나오는데..

12:59,12:45 이렇게 나오는게 아니라

12:59,12:45 이 두개는 12:00에 속해 있어야 합니다.

duration dosu fee connDate
9시대합산 9시대합산 9시대합산 09:00
10시대합산 10시대합산 10시대합산 10:00
11시대합산 11시대합산 11시대합산 11:00
12시대합산 12시대합산 12시대합산 12:00
13시대합산 13시대합산 13시대합산 13:00
14시대합산 14시대합산 14시대합산 14:00
15시대합산 15시대합산 15시대합산 15:00
16시대합산 16시대합산 16시대합산 16:00

12:59,12:45 이 두개는 connDate 12:00시에 속해 있어서

duration dosu fee connDate
9시대합산 9시대합산 9시대합산 09:00
10시대합산 10시대합산 10시대합산 10:00
11시대합산 11시대합산 11시대합산 11:00
12시대합산 12시대합산 12시대합산 12:00
13시대합산 13시대합산 13시대합산 13:00
14시대합산 14시대합산 14시대합산 14:00
15시대합산 15시대합산 15시대합산 15:00
16시대합산 16시대합산 16시대합산 16:00

위의 12시 대 합산에 합산되어 있겠죠..

또 다른 예로

331 12 24000 11:11
362 13 26000 11:13
1076 36 72000 11:16
1188 40 80000 11:18
2405 82 164000 11:22
1308 44 88000 11:29
1078 36 72000 11:34
727 25 50000 11:36
9 1 2000 11:37
2422 82 164000 11:38
1055 36 72000 11:39
1084 37 74000 11:49
354 12 24000 11:52
363 13 26000 11:58

이 데이터 들은

11시꺼에 속하므로

duration dosu fee connDate
9시대합산 9시대합산 9시대합산 09:00
10시대합산 10시대합산 10시대합산 10:00
11시대합산 11시대합산 11시대합산 11:00
12시대합산 12시대합산 12시대합산 12:00
13시대합산 13시대합산 13시대합산 13:00
14시대합산 14시대합산 14시대합산 14:00
15시대합산 15시대합산 15시대합산 15:00
16시대합산 16시대합산 16시대합산 16:00

11시 대합산에 속해 있겠죠..

 date_format(C.Connect, '%h:00') as connDate

이런식으로 해봤지만

데이터는 나오긴 하는데

duration dosu fee connDate
3896 131 262000 01:00
2441 82 164000 04:00
1284 43 86000 05:00
1314 44 88000 06:00
11506 387 774000 08:00
13596 460 920000 09:00
1274 43 86000 10:00
5903 199 398000 11:00

이렇게 제가 원하는 데로 나오긴 하는데

이상하게

13:00 이후부턴 나오지 않습니다.

%l
%h
%I
12시간제의 시 (1...12)
12시간제의 시 (01...12)
12시간제의 시 (01...12)
%k
%H
12시간제의 시 (0...23)
12시간제의 시 (00...23)

나와있는 데로

12시간제의 시 (00...23)

 H를 써보면

date_format(C.Connect, '%H:00') as connDate

이렇게 하면

duration dosu fee connDate
3896 131 262000 13:00
2441 82 164000 16:00
1284 43 86000 17:00
1314 44 88000 18:00
11506 387 774000 20:00
13596 460 920000 21:00
1274 43 86000 22:00
5903 199 398000 23:00

09:00 부터 12:00까지는 아예 나오질 않습니다.

죽겠네요..

 

투루로맨스(jung1873)님이 2010-05-07 15:48에 작성한 댓글입니다.

앗.. 이런

제가 잘못 알려드렸네요 ㅠ.ㅠ

 

select sum(duration) as duration,sum(dosu) as dosu, sum(fee) as fee ,connDate as connDate
 from
 (
    select
    C.CallLogId,
    B.idArsLog,
 A.Expert_ExpertIdx as expertIdx,
 A.Charge as charge,
 A.ChoiceCharge as choiceCharge,
 (TIME_TO_SEC(timediff(C.DisConnect, C.Connect))-20) as duration,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) as dosu,
 ceil((TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) - 20) / 30) * 2000 as fee, 
 date_format(C.Connect, '%H') as connDate
   from ars as A
   inner join arslog as B on(A.idArs = B.Ars_idArs)
   inner join calllog as C on (B.CallLog_CallLogId = C.CallLogId) 
   where TIME_TO_SEC(timediff(C.DisConnect, C.Connect)) > 20
   AND A.Charge = '1'
   AND (TO_DAYS('2010-05-01')<= TO_DAYS(C.Connect) and TO_DAYS(C.Connect)<= TO_DAYS('2010-05-05'))
 ) as todayars

 

 이걸로 해보세요 ^^

박성원(darkancia)님이 2010-05-07 17:05에 작성한 댓글입니다.

감사합니다^^

님덕분에 해결했습니다.

네이버 내공 바로 드리겠습니다.

정말 감사합니다.

투루로맨스(jung1873)님이 2010-05-07 17:08에 작성한 댓글입니다.

성원님의 대단한 맨투맨 서비스입니다. 감동 ^^

박현우(lqez)님이 2010-05-07 17:23에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29641mysql에서 대용량의 insert와 select 처리 방법 [1]
김갑열
2010-05-07
7680
29640순번을 매기고 싶습니다.. [3]
양선생
2010-05-07
7094
29639서버튜팅 부탁드립니다. 한번씩 프로그램이 늦어지는데 원인을 모르겠습니다. [1]
푸르미
2010-05-07
9779
29638안녕하세요 mysql질문입니다. [9]
투루로맨스
2010-05-07
7974
29637utf8->euc-kr 로 변환방법좀알려주세요 [2]
윤은숙
2010-05-07
8263
29636innoDB는 인덱싱시 B+트리를 사용하나요 B트리를 사용하나요? [2]
최정우
2010-05-02
8476
29635디비에 ..락이 걸리는데... [1]
쥬시쿨
2010-05-02
10030
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다