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