2016-08-18 2 views
2

테이블에 일치하는 행이있을 때 나는이 쿼리를 사용하고 훌륭한 작업을 수행합니다. Tiempo.테이블 쿼리 : 복잡한 조인

문제는 내가 실제로 알아야 할 것이 Usuario에있는 Tiempo의 일치하지 않는 행도 있다는 것입니다.

SELECT u.Id, t.empleado, CAST(MONTH(t.fecha) AS VARCHAR(2)) AS MonthNumber, CAST(YEAR(t.fecha) AS VARCHAR(4)) AS YearNumber, SUM(t.horas) AS Horas 
FROM Usuario u 
INNER JOIN Tiempo t ON u.username = t.empleado 
WHERE fecha >= '2016-08-01' and fecha <= '2016-08-31' 
GROUP BY u.id, t.empleado, CAST(MONTH(t.fecha) AS VARCHAR(2)), CAST(YEAR(t.fecha) AS VARCHAR(4)) 

는 출력 :

Id empleado MonthNumber YearNumber Horas 
86 username1 8   2016  96 
95 username2 8   2016  80 
99 username3 8   2016  47 
102 username4 8   2016  85 

그리고 이것은 내가 무엇을 찾고 있습니다 :

Id empleado MonthNumber YearNumber Horas 
86 username1 8   2016  96 
95 username2 8   2016  80 
99 username3 8   2016  47 
102 username4 8   2016  85 
102 username5 8   2016  null (or 0) 

편집 : 샘플 데이터 : download

+1

, 당신은 실제 문제의 샘플 데이터를 포함한다 – Sami

+0

을 내부가 왼쪽으로 가입 교체하세요. 지금 당장은 아래의 답변 중 적어도 일부가 문제를 해결하지 않는 이유가 명확하지 않습니다. –

+0

@Sami는 목표를 달성하지 못했지만 스틸은 같은 결과를 얻습니다. 테스트를위한 완벽한 세트를 제공하는 샘플 데이터 링크를 확인하십시오. –

답변

3

데이터 f 또는 누락 된 행은 테이블에, 당신은 LEFT JOIN 대신 INNER JOIN의 AN 할 수있는 : 당신은 left join을 원하는

SELECT u.Id, 
     COALESCE(t.empleado, 'NA') 
     COALESCE(CAST(MONTH(t.fecha) AS VARCHAR(2)), 'NA') AS MonthNumber, 
     COALESCE(CAST(YEAR(t.fecha) AS VARCHAR(4)), 'NA') AS YearNumber, 
     SUM(t.horas) AS Horas 
FROM Usuario u 
LEFT OUTER JOIN Tiempo t 
    ON u.username = t.empleado AND 
     fecha >= '2016-08-01' AND 
     fecha <= '2016-08-31' 
GROUP BY u.id, 
     t.empleado, 
     CAST(MONTH(t.fecha) AS VARCHAR(2)), 
     CAST(YEAR(t.fecha) AS VARCHAR(4)) 
+0

고마워, 나는 이미 그걸 시도했지만 출력은 내측과 똑같이 똑같다. –

+0

테이블에서 샘플 데이터를 보여주십시오. –

+2

@ChuckNorris - 'fecha'가 '티엠포'테이블에 있기 때문에'where' 조건을'on' 조건으로 옮겨야한다고 생각합니다. 그대로, 그것은 '외부 조인'을 부정합니다. – sgeddes

0

을,하지만 당신은 조심해야합니다. 테이블에 조건은 on 절에 있어야합니다 : 링크가 시간이 지남에 깰 수

SELECT u.Id, t.empleado, CAST(MONTH(t.fecha) AS VARCHAR(2)) AS MonthNumber, 
     CAST(YEAR(t.fecha) AS VARCHAR(4)) AS YearNumber, 
     SUM(t.horas) AS Horas 
FROM Usuario u LEFT JOIN 
    Tiempo t 
    ON u.username = t.empleado AND 
     t.fecha >= '2016-08-01' AND t.fecha <= '2016-08-31' 
GROUP BY u.id, t.empleado, CAST(MONTH(t.fecha) AS VARCHAR(2)), CAST(YEAR(t.fecha) AS VARCHAR(4)) 
+0

여전히 동일한 결과를 제공하므로 잠시 후에 sqlfiddle을 제공 할 것입니다. –

+1

@TimBiegeleisen 솔루션에 대한 내 의견은 정확히이 말은 다른 답변을 게시하는 것보다 낫지 않습니까? 그럼에도 불구하고 귀하의 질의는 위의 '내부 조인'을 사용하고 있습니다 ... – sgeddes

+0

@sgeddes '왼쪽 외부 조인'에 대한 답변을 게시하고 조건을 'on'으로 옮기는 것은 본질적으로 속임수입니다. 감사. –