테이블 1입니다.
h
0
1
2
3
테이블 2입니다.
id sdate edate idate
a 201003300 201003301 201003300
a 201003301 201003302 201003301
a 201003302 201003303 201003302
a 201003303 201003300 201003303
a 201003310 201003311 201003310
a 201003311 201003312 201003311
a 201003312 201003313 201003312
a 201003313 201003310 201003313
테이블 3입니다.
id pw ip
a *** 127.0.0.1
b *** 127.0.0.1
c *** 127.0.0.1
테이블 1을 기준으로 매시간마다 들어온 데이터가 누락되었는지 누락되지 않았는지를 날짜 검색하려고 합니다.
만약 테이블 2에서 sdate 컬럼의 20100301과 201003312의 컬럼이 빈 컬럼으로 나타났을 때
id sdate edate idate
a 201003300 201003301 201003300
a 201003302 201003303 201003302
a 201003303 201003300 201003303
a 201003310 201003311 201003310
a 201003311 201003312 201003311
a 201003313 201003310 201003313
현재 테이블의 데이터가 위와 같다면
SELECT
IFNULL(CONCAT(
CAST(sdate AS CHAR)
, '분 ~ '
, CAST(edate AS CHAR)
, '분'), '누락') TI
, IFNULL(CAST(idate AS CHAR), '누락') INDI
, IFNULL(CONCAT(
SUBSTRING(idate, 1,4)
, '년'
, SUBSTRING(idate, 5,2)
, '월'
, SUBSTRING(idate, 7,2)
, '일 '
, SUBSTRING(idate, 9,1)
, '시'
), '누락') INDIDT
, IFNULL(ip, (SELECT ip FROM 3 WHERE id= 'a')) IP
, IFNULL(id, 'a') ID
, sdate STDT
, h
FROM
(SELECT
h
FROM
1) A
LEFT OUTER JOIN
(SELECT
A.*
, B.ip
FROM
2 A
, 3 B
WHERE
A.id = 'a'
AND A.id = B.id
AND A.sdate LIKE '20100330%') B
ON A.h = SUBSTRING(B.sdate, 9, 1)
과 같이 출력을 하면
T1 INDI INDIDT IP ID STDT h
0분 ~ 1분 201003300 2010년 03월 30일 0시 127.0.0.1 a 201003300 0
누락 누락 누락 127.0.0.1 a {null} 1
2분 ~ 3분 201003302 2010년 03월 30일 2시 127.0.0.1 a 201003302 2
3분 ~ 0분 201003303 2010년 03월 30일 3시 127.0.0.1 a 201003303 3
0분 ~ 1분 201003310 2010년 03월 31일 0시 127.0.0.1 a 201003310 0
1분 ~ 2분 201003311 2010년 03월 31일 1시 127.0.0.1 a 201003311 1
누락 누락 누락 127.0.0.1 a {null} 2
3분 ~ 0분 201003313 2010년 03월 31일 3시 127.0.0.1 a 201003313 3
위와 같이 출력 됩니다.
그래서 이 조건 중에서 누락 부분 만 날짜를 포함해서 출력을 하려고 했는데요.
그렇게 하자면 테이블에 데이터가 존재하지 않기 때문에 이를 감안해서 누락된 데이터의 날짜를 포함해서 출력해야 하는 부분이 포함되어야 합니다.
그리고 날짜 검색을 위에서는 하루 분만 검색을 하는데 기간 검색으로 바꾸어 위의 쿼리에서 left outer join
부분만 나타내겠습니다.
LEFT OUTER JOIN
(SELECT
A.*
, B.ip
FROM
2 A
, 3 B
WHERE
A.id = 'a'
AND A.id = B.id
AND A.sdate <= '20100330%'
AND A.sdate >= '20100331%'
) B
ON A.h = SUBSTRING(B.sdate, 9, 1)
WHERE B.TI IS NULL
이와 같이 출력하거나
LEFT OUTER JOIN
(SELECT
A.*
, B.ip
FROM
2 A
, 3 B
WHERE
A.id = 'a'
AND A.id = B.id
AND A.sdate <= '20100330%'
AND A.sdate >= '20100331%'
) B
ON A.h = SUBSTRING(B.sdate, 9, 1)
WHERE B.sdate <= '20100331%'
AND B.sdate >= '20100330%'
AND B.TI IS NULL
와 같이 하면 기간내에서 누락된 값이 출력되지 않거나 원하지 않는 값이 출력 됩니다.
제가 쿼리를 잘못 작성 한 듯 한데 원하는 답을 찾을 수가 없습니다.
도움 부탁드리겠습니다. |