안녕하세요!!!
요새 많이들 하고 있는
휴면계정 관련해서
회원 테이블의 3개의 컬럼을 차례대로 검색하려고 하는데요
A 컬럼 - 가입날짜
B 컬럼 - 정보수정날짜
C 컬럼 - 로그인 날짜
이와 같이 되어있습니다.
1년전 오늘날짜 기준으로 로그인 하지 않은 회원목록을 뽑을려고합니다.
(메일을 보내려고합니다.)
우선순위가
1. 로그인 컬럼을 먼저 비교해서 NULL 이면 , 수정컬럼을 조회 이거 역시 NULL 이면, 가입날짜 를 1년전 오늘날짜와 비교 하려고합니다.
가입날짜는 무조건 들어가있습니다.
근데 가입만 하고 로그인 하지않아서 로그인 컬럼에 값이 없는 회원도 있습니다.
수정컬럼도 마찬가지 이구요
쿼리를....어케 해야할까요...
CASE 문도 에러가 나구요..
읽어주셔서 감사합니다.
Comment 7
-
Terry
2015.09.23 16:15
-
Terry
2015.09.23 16:18
참고적으로 날짜컬럼의 데이터들이 정상적으로 들어가있으면 문제가 안되나
그게 아닌 값이 있을경우는 문제될겁니다..^^
단순 문자값으로 데이터를 조회하는 형태라 ㅡ_ㅡ;;;
그런 부분은 입력단에서 오류검증 및 처리가 되어있다면
문제가 없으실거구요..
그럼 좋은하루 보내세요~
-
즈타
2015.09.23 18:08
/Terry
감사드립니다.
주신 거 가지고 열심히 분석해서 적용하겠습니다.
-
피오니
2015.09.23 18:28
COALESCE 쓰면 간단합니다.. ^^Select a.*From tblA aWhere COALESCE(login_ymd, chg_ymd, reg_ymd) Between @ls_ymd And @ls_today -
Terry
2015.09.23 18:48
우와아~~쿼리가 엄청 간결해지네요..
가독성도 훨씬 좋구요..^^
한수 배우고 갑니다..감사해요~
-
Terry
2015.09.25 10:31
IsNull 로도 왜 안될까 하다가
피오나님이 작성하신 쿼리를 보니
뭔가 깨달음을 얻었습니다~~~!!
IsNull 로도 이리 간단하게 수정이 되는군요..
물론 COALESCE 만큼은 아니지만요..^^
제 실력도 부족하기도 하지만..
제 머리도 굳어있었다는걸 알게 되었네요..
다시한번 감사드립니다.
즐거운 추석연휴 보내세요^^
---쿼리시작---
Declare @ls_today Char(8)
Declare @ls_ymd Char(8)Select @ls_today = CONVERT(Char(8), Getdate(), 112)
Select @ls_ymd = CONVERT(Char(8),Dateadd(year,-1,Getdate()), 112)with tblA(id,reg_ymd,chg_ymd,login_ymd) As
(
Select '1','20010301','20010801','20110301' Union All
Select '2','20100301','20100601','20120301' Union All
Select '3','20110301',NULL ,'20130301' Union All
Select '4','20040301',NULL ,'20140701' Union All
Select '5','20070301',NULL ,'20080301' Union All
Select '6','20090301',NULL ,'20110301' Union All
Select '7','20060301',NULL ,NULL Union All
Select '8','20130301',NULL ,'20141023' Union All
Select '9','20150901','20150911','20150913'
)
Select a.*
From tblA a
Where ISNULL(a.login_ymd,IsNull(chg_ymd,IsNull(reg_ymd,''))) Between @ls_ymd And @ls_today
---쿼리끝--- -
즈타
2015.09.30 09:52
아이고 제가 너무 늦게 봤네요
/피오니
/Terry
두분께 감사드립니다. ( _ _ )
Case 문으로 처리가 가능하네요..
원하는 결과물인지는 모르겠지만^^;;
참고만 하세요..
---쿼리시작---
Declare @ls_today Char(8)
Declare @ls_ymd Char(8)
Select @ls_today = CONVERT(Char(8), Getdate(), 112)
Select @ls_ymd = CONVERT(Char(8),Dateadd(year,-1,Getdate()), 112)
with tblA(id,reg_ymd,chg_ymd,login_ymd) As
(
Select '1','20010301','20010801','20110301' Union All
Select '2','20100301','20100601','20120301' Union All
Select '3','20110301',NULL ,'20130301' Union All
Select '4','20040301',NULL ,'20140701' Union All
Select '5','20070301',NULL ,'20080301' Union All
Select '6','20090301',NULL ,'20110301' Union All
Select '7','20060301',NULL ,NULL Union All
Select '8','20130301',NULL ,'20141023' Union All
Select '9','20150901','20150911','20150913'
)
Select a.*
From tblA a
Where
(
Case When
ISNULL(a.login_ymd,'') = ''
Then (
Case When
ISNULL(a.chg_ymd,'') = ''
Then a.reg_ymd
Else a.chg_ymd
End
)
Else a.login_ymd
End
)
Between @ls_ymd And @ls_today
---쿼리끝---
--결과--
-----------------------------------------------
8 20130301 NULL 20141023
9 20150901 20150911 20150913
-----------------------------------------------