2014-01-29 7 views
0

이 같은 것이 이미 다른 곳에서 논의 된 적이 있다면 사전에 사과하겠습니다. 그러나 그럴 경우 찾지 못했습니다 (그런 식으로 검색하는 방법조차 모르겠습니다) . 나는 "직원"과 "떠나라"라는 두 테이블에 합류하려고합니다. "직원"테이블의 모든 직원을 나열하고 '휴가'테이블 (휴가 테이블의 bdate 열)이 2014 년 1 월 1 일 (또는 현재 연도)보다 큰 "휴가"테이블의 휴가 데이터로 보고서를 채우고 싶습니다.). 문제는 모든 직원이 데이터를 남겨 두는 것이 아니므로 일반 가입은 실제로 데이터를 남긴 직원의 데이터 만 가져 오는 것입니다. 내가 원하는 것은 왼쪽 조인이지만, 실제로 두 테이블 모두에서 해당 직원의 데이터가있는 두 테이블의 레코드 만 가져올뿐입니다.하나의 테이블에서 조건을 가진 다중 테이블 조인

Select bunch_of_columns, leave.bdate, SUM(leave.Vhours) as TotalVacationHours, SUM(leave.shours) as TotalSickHours 
from employees 
left join leave on employees.id=leave.id 
where employees.user_active ='1' AND leave.BDate >= '2014-01-01' 
group by employees.id 
Order by employees.user_last 

이렇게하면 "2014-01-01"이후에 휴가 기록이있는 개인의 기록이 하나 생성됩니다. 휴가 테이블의 "bdate"열이 새 해의 날짜보다 큰 곳에서 휴가 테이블의 사용 가능한 데이터가있는 직원 테이블의 직원 레코드 목록을 원합니다.

+-----+----------+---------------+---------------+--------------+ 
|ID | Name  | Vacation Hrs | Sick Hrs  | Date   | 
+-----+----------+---------------+---------------+--------------+ 
| 1 | Bob  | 5    | 8    | 2014-01-01 | 
| 2 | Lucy  | NULL   | NULL   | NULL   | 
| 3 | Jerry | NULL   | NULL   | NULL   | 
| 4 | Dieter | 3    | 5    | 2014-01-08 | 
| 5 | Sprockets| NULL   | NULL   | NULL   | 
+-----+----------+---------------+---------------+--------------+ 

하지 않음이 :

+-----+----------+---------------+---------------+--------------+ 
| row | Name  | Vacation Hrs | Sick Hrs  | Date   | 
+-----+----------+---------------+---------------+--------------+ 
| 1 | Bob  | 5    | 8    | 2014-01-01 | 
| 4 | Dieter | 3    | 5    | 2014-01-08 | 
+-----+----------+---------------+---------------+--------------+ 

답변

3

그것 때문에 당신의 WHERE 조건의

내가이 원하는. 당신이 LEFT JOIN을 다음 NULL을 할 수없는 무언가에 대한 권리 테이블의 열을 필터링하는 경우가 INNER JOIN을 수행하는 것과의

leave.BDate >= '2014-01-01' 

.

퇴근 날짜가 없으면 기록이 기준에 맞지 않습니다. 대신 다음을 확인하십시오.

(leave.BDate >= '2014-01-01' OR leave.BDate IS NULL) 
+0

쉽게 말할를 위해 가입에 날짜 조건을 적용입니다! 나는 그것이 왜 나에게 일어나지 않았는지 모르겠다. OGHaza와 DRapp, 정말 고마워요! 그것은 아름답게 작동합니다! – user3059142

0

이러한 조건에 대해 전체 외부 조인을 사용해보십시오. MSDN

전체 외부에서

가입 또는 전체 일치가 만들어 일치하는 행이 존재하지 않는 장소에 배치 NULL을 할 수 있습니다 어디든지 행을 일치, 반환에게 두 테이블의 모든 행을 조인합니다.

2

(OGHaza에 의해 지적)를 작성하는 또 다른 방법은 부분

Select 
     bunch_of_columns, 
     leave.bdate, 
     COALESCE(SUM(leave.Vhours), 0) as TotalVacationHours, 
     COALESCE(SUM(leave.shours), 0) as TotalSickHours 
    from 
     employees 
     left join leave 
      on employees.id=leave.id 
      AND leave.BDate >= '2014-01-01' 
    where 
     employees.user_active ='1' 
    group by 
     employees.id 
    Order by 
     employees.user_last 
+0

당신이 그것을 언급 했으니, 그것은 정확히 내가 그것을 실제로 할 수있는 방법입니다;) – OGHaza

관련 문제