Código SQL:
Ver originalCREATE TABLE #usuarios(
id INT,
nombre nvarchar(20)
)
CREATE TABLE #asistencia(
id INT,
id_usuario INT,
fecha datetime
)
INSERT INTO #usuarios VALUES (1,'yo')
INSERT INTO #usuarios VALUES (2,'tu')
INSERT INTO #usuarios VALUES (3,'el')
INSERT INTO #asistencia VALUES (1,1,getdate())
INSERT INTO #asistencia VALUES (2,2,getdate())
INSERT INTO #asistencia VALUES (3,1,dateadd(dd,-1,getdate()))
INSERT INTO #asistencia VALUES (4,3,dateadd(dd,-2,getdate()))
SELECT
CASE
WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
FROM
(
SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
) AS t1
LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
WHERE t2.id_usuario IS NULL AND t2.fecha IS NULL
Resultado:
faltante fecha_faltante
1 06-30-19
2 06-30-19
2 07-01-19
3 07-01-19
3 07-02-19
El codigo esta en sql server pero creo puedes adaptarlo, que hice, primero cree una tabla con las fechas y los usuarios, un usuario para cada fecha,
Código SQL:
Ver originalSELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia)
esto para poder saber cuando asistio y cuando no, esto es necesario para este tipo de consultas porque no tienes nada contra que comparar. Aqui hice un cross join para que por cada usuario le generara un registro de fecha, con estos datos ya solo compare contra la tabla de asistencias para saber si ese dia asistio o no.
Filtrado por fecha:
Código SQL:
Ver originalSELECT
CASE
WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
FROM
(
SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
) AS t1
LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
WHERE (t2.id_usuario IS NULL AND t2.fecha IS NULL) AND t1.fecha='06-30-19'
Resultado:
faltante fecha_faltante
1 06-30-19
2 06-30-19