유저번호 | 첫구매 | 가입일 | 비고 |
1 | 20140701 | 20140701 |
|
2 | 20140702 | 20140701 |
|
3 | 20140704 | 20140701 |
|
유저번호 | 구매품목 | 구매가격 | 구매일 |
1 | 2000 | 1000 | 20140701 |
1 | 2000 | 1000 | 20140701 |
2 | 2005 | 2400 | 20140701 |
2 | 2001 | 1200 | 20140702 |
3 | 2003 | 1500 | 20140704 |
1 | 2002 | 1300 | 20140704 |
2 | 2002 | 1300 | 20140705 |
2 | 2001 | 1200 | 20140705 |
1 | 2003 | 1500 | 20140705 |
유저번호 | 접속일 |
1 | 20140701 |
2 | 20140701 |
1 | 20140703 |
3 | 20140703 |
2 | 20140703 |
3 | 20140704 |
1 | 20140705 |
2 | 20140705 |
3 | 20140705 |
위에서부터 차례대로 A, B, C의 테이블이 있습니다.
전날 접속한 사람(C테이블의 접속일 기준) 중에 접속했다면 전일에 가입했는지, 첫구매를 했는지 구매를 했는지를 검색하려고 합니다.
그래서 세 테이블을 INNER JOIN으로 묶어 검색을 하는데 금일 구매를 했는지 여부에서 막힙니다.
case문으로 DATADIFF로 조건 걸어서 전일 구매 기록이 있으면 1로 검색되도록 해놨는데 칼럼이 전부 검색됩니다. 검색해보니 MAX를 쓰면 최고값을 불러온다해서 문제는 해결될줄 알았는데 전일 시간 기록중 최고값이 아니라 칼럼 전체에서 최고값이 검색되는 것 같습니다. 3번유저를 예를 들면 4일 기록을 검색했을 때 첫구매를 했으니 첫구매고 구매 여부고 전부 1이 되어야 하는데, 첫구매여부는 1로 검색이 되지만 구매여부는 0으로 검색되고 있는거지요ㅠㅠ어떻게 조건을 줘야 검색하고 싶은 날짜에서만 검색이 될까요?
아래는 제가 쓴 구문입니다.
DECLARE @RecordDate DATE
DECLARE @Day INT
DECLARE @Date varchar(30)
SET @RecordDate = CONVERT(VARCHAR(10), GETDATE(), 111)--YYYY/MM/DD
SET @Date = CONVERT(VARCHAR(8), GETDATE(), 112)
SET @Day = DATEPART(dd, @RecordDate)
SELECT DISTINCT
@Date +'_'+ CONVERT(VARCHAR, A.유저번호, 30) AS RecordSID,
@RecordDate,
A.유저번호,
CASE
WHEN DATEDIFF(dd, C.접속일, @RecordDate) = 0
THEN 1
ELSE 0
END 로그인여부,
CASE
WHEN DATEDIFF(dd, A.가입일, @RecordDate) = 0
THEN 1
ELSE 0
END 가입여부,
CASE
WHEN DATEDIFF(DAY, MAX(B.구입일) OVER (PARTITION BY B.유저번호), @RecordDate) = 0
THEN 1
ELSE 0
END 구매여부,
CASE
WHEN DATEDIFF(DAY, A.첫구매일, @RecordDate) = 0
THEN 1
ELSE 0
END 첫구매여부
FROM
유저테이블 AS A INNER JOIN
구매테이블 AS B ON A.유저번호= B.유저번호 INNER JOIN
로그인테이블 AS C ON A.유저번호= C.유저번호
WHERE DATEDIFF(DAY, C.접속일, @RecordDate) = 0
GROUP BY A.유저번호, A.가입일, B.유저번호, B.구매일, C.접속일, A.첫구매
Comment 1
-
Hisory
2014.07.07 14:00
100% 원하시는 답변은 아니지만 이정도면 원하시는 내용을 만드실수 있을것 같네여
Declare @A table
(
유저번호 Varchar(100)
,첫구매 Varchar(100)
,가입일 Varchar(100)
,비고 Varchar(100)
)
Declare @B table
(
유저번호 Varchar(100)
,구매품목 Varchar(100)
,구매가격 Varchar(100)
,구매일 Varchar(100)
)
Declare @C table
(
유저번호 Varchar(100)
,접속일 Varchar(100)
)
insert @A
values('1','20140701','20140701','')
,('2','20140702','20140701','')
,('3','20140704','20140701','')
insert @B
values('1','2000','1000','20140701')
,('1','2000','1000','20140701')
,('2','2005','2400','20140701')
,('2','2001','1200','20140702')
,('3','2003','1500','20140704')
,('1','2002','1300','20140704')
,('2','2002','1300','20140705')
,('2','2001','1200','20140705')
,('1','2003','1500','20140705')
insert @C
VALUES('1','20140701')
,('2','20140701')
,('1','20140703')
,('3','20140703')
,('2','20140703')
,('3','20140704')
,('1','20140705')
,('2','20140705')
,('3','20140705')
Select * From @A As a
Outer Apply
(
Select top 1 접속일 As '최종접속일' From @C
Where 유저번호 = a.유저번호
Order By 접속일 Desc
) As c
Outer Apply
(
Select top 1 구매품목 As '최종구매품목' , 구매가격 As '최종구매가격'
, 구매일 As '최종구매일'
From @B
Where 유저번호 = a.유저번호
ORDER By 구매일 Desc
) As b