테이블 조인할때 두 행을 고정시키는 방법 좀..
매일 매일 작업 수행결과에 대한 로그가 쌓입니다.
로그는 매일 매일 쌓이는데 실패할 경우 아예 로그가 기록이 안됩니다.
수금테이블
no 날짜 이름,성공
0, 2010년 3월 1일, 갑, O
1, 2010년 3월 1일, 을, O
2, 2010년 3월 1일, 병, O
3, 2010년 3월 1일, 정, O
4, 2010년 3월 2일, 갑, O
5, 2010년 3월 2일, 을, O
6, 2010년 3월 2일, 병, O
7, 2010년 3월 2일, 정, O
8, 2010년 3월 3일, 갑, O
9, 2010년 3월 3일, 을, O
위 로그를 보시면 3월 3일은 병과 정이 로그를 남기지 않았습니다.
실패를 하게 되면 로그가 아예 안 남아서 NULL로 됩니다.
위 처럼 테이블에 로그가 기록이 될 경우 아래와 같은 출력을 얻고자 합니다.
저는 채무자 테이블을 만들어서 조인을 하려고 했는데, 초보라서 잘 모르겠네요
채무자테이블
no 이름
0, 갑
1, 을
2, 병
3, 정
채무자 테이블과 수금테이블의 이름으로 라이트조인을 하면
아래와 같이 나옵니다.
이름, 날짜 성공
갑, 2010년 3월1일 O
갑, 2010년 3월2일 O
....
....
...
병, NULL NULL
정, NULL NULL
이렇게 되면 정이라는 놈이 수금이 안되었다는 것을 알고 독촉을 할 수 있으니 완성이라고 생각했는데, 이렇게 되면 날짜까지도 NULL로 바뀌기 때문에 where로 날짜 필터링을 했을때 검색이 되지 않습니다. 제가 원하는 결과는
where로 날짜를 지정했을때
이름 날짜 성공
갑, 2010년 3월 3일 O
을, 2010년 3월 3일 O
병, 2010년 3월 3일 NULL
정, 2010년 3월 3일 NULL
이렇게 나와야 합니다.
이름과, 날짜 두 행이 고정되어 나오고 성공과 실패가 O와 NULL로 구분되어야 하는데
디비설계를 처음부터 다시 해야 하나 싶기도 하고 조인 방법이 잘못되었나 싶고.. 아무것도 모르는데 할려고 하니 어렵네요
누군가가 좀 도와주시면 감사하겠습니다.
Cross Join 을 알아보셔야 겠네요
다음처럼 요약 가능할것 같습니다.
1. 3/3일에 갑,을,병,정 이 전부다 로그가 없을때 어떻게 처리할것인가?
- 별도의 달력테이블이 존재하지 않는다고 하면 당연 3/3에 대해서는 한행도 출력되지 않습니다.
2. 달력테이블이 없으면 만들면 됩니다.
1) 먼저 로그 테이블에서 기간동안 날짜만 Grouping 해서 테이블을 만듭니다.
2) 1)에서 만든 테이블과 채무 테이블을 Inner Join - 1), 2) 과정이 이미 Cross Join - 해서 테이블을 만듭니다.
3) 0, Null 은 Sub Query 를 이용하여 2)에서 만들어진 테이블을 이용하여 결과를 질의해 옵니다.
이런식이겠죠
------------------------------------------------------------
ProgrammingHolic
------------------------------------------------------------
ProgrammingHolic
댓글 달기