Interrogation de tables: jointure complexe

J'ai cette requête et cela fait du bon boulot quand il y a des lignes correspondantes sur la table Tiempo .

Le problème est que ce que j'ai vraiment besoin de voir, ce sont les lignes sans correspondance dans Tiempo , qui existent aussi dans Usuario .

 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)) 

C'est la sortie:

 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 

Et voici ce que je cherche:

 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: Sample Data: download

En supposant que datatables de la ligne manquante existent dans votre table, vous faites un LEFT JOIN au lieu d'un INNER 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)) 

Vous voulez une left join , mais vous devez faire attention. Les conditions sur la deuxième table doivent être dans la clause 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))