프로젝트 마무리 중에 내가 짜놓고도 들여다보니 머리가 어지럽다.
기간조건이 안 들어갈때는 서브쿼리를 그냥 View로 만들어서 하니 그나마 더 간단했는데,
날짜 조건이 들어가다 보니 서브쿼리단에서 기간조건이 부여되야해서 풀어서 썼더니 너무 복잡하다.
파란색이 원래 뷰로 되어 있던거고.
이눔의 CID가 불확실하게 전달되다보니. NoneCID 때문에 if 조건이 하나 들어가서 동일한 반복문이 더 어렵게 되었다.
CREATE Proc [dbo].[up_DiffCidLog]
@Sdate DateTime ,
@Edate DateTime,
@DCnt int,
@ChkNoneCid char(1)='0'
as
if(@ChkNoneCid = '1' )
select a.* from
(
SELECT CID, TID, COUNT(TID) AS TIDCnt, MAX(mdate) AS MWdate
FROM (SELECT CID, TID, MAX(Wdate) AS mdate
FROM dbo.CardUse
Where Wdate Between @Sdate And @Edate
GROUP BY CID, TID, Wdate
) a
GROUP BY CID, TID) a,
(
select Cid From (
select * from
(
SELECT CID, TID, COUNT(TID) AS TIDCnt, MAX(mdate) AS MWdate
FROM (SELECT CID, TID, MAX(Wdate) AS mdate
FROM dbo.CardUse
Where Wdate Between @Sdate And @Edate
GROUP BY CID, TID, Wdate
) a
GROUP BY CID, TID) b
where tidcnt >;= @DCnt ) as d
group by cid
having count(cid) >; 1
) as b
where a.cid=b.cid
else
select a.* from
(
SELECT CID, TID, COUNT(TID) AS TIDCnt, MAX(mdate) AS MWdate
FROM (SELECT CID, TID, MAX(Wdate) AS mdate
FROM dbo.CardUse
Where Wdate Between @Sdate And @Edate
GROUP BY CID, TID, Wdate) a
GROUP BY CID, TID
) a,
(
select cid From (
select * from
(
SELECT CID, TID, COUNT(TID) AS TIDCnt, MAX(mdate) AS MWdate
FROM (SELECT CID, TID, MAX(Wdate) AS mdate
FROM dbo.CardUse
Where Wdate Between @Sdate And @Edate
GROUP BY CID, TID, Wdate) a
GROUP BY CID, TID
) b
where tidcnt >;= @DCnt and cid <;>;' ) as d
group by cid
having count(cid) >; 1
) as b
where a.cid=b.cid
GO
-- 샘플로 테스트했던 사항
declare @Sdate datetime
declare @Edate datetime
set @Sdate = dateadd(d,-30,getdate())
set @Edate = getdate()
exec up_diffTidLog @Sdate, @Edate,1,1
----- 쿼리 결과는 아래와 같다.
CID TID TIDCnt MWdate
--------------- --------------- ----------- ------------------------------------------------------
01030014508 12345678 1 2006-06-10 11:28:00.000
01030014508 123456789012345 2 2006-06-13 17:20:00.000
(2개 행 적용됨)