얼마전에 질문을 올려서
좋은 답변을 받아서
잘 사용하고 있습니다.
근데 문제가 하나 생기더군요
where 조건중에서
5개의 컬럼중에서 날짜가 가장 최근인 컬럼하고 비교를 해야하는데요
그게 쉽지가 않네요
1개의 컬럼은 무조건 날짜값이 있지만
나머지 4개의 컬럼은 null 일수도있고 값이 있을수도 있거든요
mysql 에선 greatest 를 이용하면 되던데요
mssql 에선 찾아봐두 없더라구요
먼가 응용을 하고 싶은데 쿼리가 약하다 보니...
머리만 지끈거리네요
그래서 도움 요청합니다.~~
읽어주셔서 감사합니다.
Comment 3
-
Terry
2015.09.30 18:42
-
피오니
2015.09.30 19:14
DECLARE @tbl TABLE (idx int identity(1,1),dt1 varchar(8),dt2 varchar(8),dt3 varchar(8),dt4 varchar(8),dt5 varchar(8))INSERTINTO @tbl(dt1, dt2, dt3, dt4, dt5)SELECT '20150101', '20150201', null, '20150401', nullUNION ALLSELECT '20150101', null, '20150201', '20150301', nullUNION ALLSELECT null, null, null, null, '20150501'SELECT *FROM (SELECT *, (SELECT MAX(dt) FROM (VALUES (dt1),(dt2),(dt3),(dt4),(dt5)) t(dt)) AS max_dtFROM @tbl) xWHERE max_dt BETWEEN '20150401' AND '20150501' -
즈타
2015.10.02 11:27
헉....
전에도 두분이서 답변 달아주셨는데
또 이렇게 답변 달아주셔서 감사합니다.
많은 도움이 되었습니다.
다시한번 감사합니다.!!!!!!!
펑션하나 만들어서 Where 조건절에서 호출하여 사용하시면 됩니다.
없으면 만들어야죠 -,-;;;
참고만 하세요~~
--1.펑션 Create문
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[f_max_ymd] (@as_ymd1 char(8),@as_ymd2 char(8),@as_ymd3 char(8),@as_ymd4 char(8) )
returns char(8)
as
Begin
Declare @ls_max_ymd char(8)
SELECT @ls_max_ymd =
(
SELECT MAX(a.ymd)
FROM (
Select IsNull(@as_ymd1,'') As ymd Union All
Select IsNull(@as_ymd2,'') As ymd Union All
Select IsNull(@as_ymd3,'') As ymd Union All
Select IsNull(@as_ymd4,'') As ymd
) a
)
Return @ls_max_ymd
end
GO
--2. 쿼리문
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,ymd1,ymd2) As
(
Select '1','20010301','20010801','20110301',NULL,'20150903' Union All
Select '2','20100301','20100601','20120301',NULL,'20150903' Union All
Select '3','20110301',NULL ,'20130301',NULL,'20150903' Union All
Select '4','20040301',NULL ,'20140701',NULL,'20150903' Union All
Select '5','20070301',NULL ,'20080301',NULL,'20150903' Union All
Select '6','20090301',NULL ,'20110301',NULL,'20150903' Union All
Select '7','20060301',NULL ,NULL ,NULL,'20150903' Union All
Select '8','20130301',NULL ,'20141023',NULL,'20150903' Union All
Select '9','20150901','20150911','20150913',NULL,'20150903'
)
Select a.*
,dbo.f_max_ymd(a.chg_ymd,login_ymd,ymd1,ymd2)
From tblA a
Where COALESCE(login_ymd, chg_ymd, reg_ymd) Between @ls_ymd And @ls_today