테이블 조인할때 두 행을 고정시키는 방법 좀..

ezmirk의 이미지

매일 매일 작업 수행결과에 대한 로그가 쌓입니다.
로그는 매일 매일 쌓이는데 실패할 경우 아예 로그가 기록이 안됩니다.

수금테이블
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로 구분되어야 하는데

디비설계를 처음부터 다시 해야 하나 싶기도 하고 조인 방법이 잘못되었나 싶고.. 아무것도 모르는데 할려고 하니 어렵네요
누군가가 좀 도와주시면 감사하겠습니다.

swish95의 이미지

다음처럼 요약 가능할것 같습니다.

1. 3/3일에 갑,을,병,정 이 전부다 로그가 없을때 어떻게 처리할것인가?
- 별도의 달력테이블이 존재하지 않는다고 하면 당연 3/3에 대해서는 한행도 출력되지 않습니다.

2. 달력테이블이 없으면 만들면 됩니다.
1) 먼저 로그 테이블에서 기간동안 날짜만 Grouping 해서 테이블을 만듭니다.
2) 1)에서 만든 테이블과 채무 테이블을 Inner Join - 1), 2) 과정이 이미 Cross Join - 해서 테이블을 만듭니다.
3) 0, Null 은 Sub Query 를 이용하여 2)에서 만들어진 테이블을 이용하여 결과를 질의해 옵니다.

select 채무.이름
        , 달력.날짜
        , (select 수금.성공 from 수금 where 수금.날짜 = 달력.날짜 and 수금.이름 = 채무.이름) as 성공
from 채무
 inner join (select 날짜 from 수금 where 날짜 between 시작 and 종료 group by 날짜) as 달력

이런식이겠죠
------------------------------------------------------------
ProgrammingHolic

------------------------------------------------------------
ProgrammingHolic