2016-08-18 9 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) 

EDIT:サンプルデータ:download

+1

インナー左で参加リンクは時間をかけて破ることができるようあなたは、あなたの実際の質問にサンプルデータが含まれている必要があり – Sami

+0

参加交換してください。今のところ、以下の答えのどれかがあなたの問題を少なくとも部分的に修正していない理由は明確ではありません。 –

+0

@Sami、それは目標を達成しないだろう、スティルは同じ結果を得る。テストのための完全なセットを提供するサンプルデータリンクを確認してください。 –

答えて

3

データfまたは不足している行があなたのテーブルに存在する、あなたの代わりにINNER JOINLEFT 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

ありがとう、私はすでにそれを試みましたが、出力はまったく同じINNERとRIGHTと同じです。 –

+0

テーブルのサンプルデータを表示してください。 –

+2

@ChuckNorris - 'どこで'条件を 'on'条件に移すべきだと思うのは、' fecha'が 'tiempo'テーブルにあるからです。つまり、それは '外部結合 'を否定しています。 – sgeddes

0

あなたはleft joinをしたい、しかし、あなたは注意する必要があります。 テーブルの上に条件が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

まだ同じ結果が得られていますが、1分でsqlfiddleを提供します。 –

+1

@TimBiegeleisenのソリューションに対する私のコメントはこれを正確に言っていますが、別の回答を投稿するよりも優れていませんか?それにもかかわらず、あなたのクエリは上記の「内部結合」を使用しています... – sgeddes

+0

@sgeddes「左外部結合」の回答を投稿し、その条件を 'on'に移動してください。ありがとう。 –

関連する問題