Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/07/2019, 14:48
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obtener registros de una tabla que no estén en otra

Código SQL:
Ver original
  1. CREATE TABLE #usuarios(
  2. id INT,
  3. nombre nvarchar(20)
  4. )
  5.  
  6. CREATE TABLE #asistencia(
  7. id INT,
  8. id_usuario INT,
  9. fecha datetime
  10. )
  11.  
  12. INSERT INTO #usuarios VALUES (1,'yo')
  13. INSERT INTO #usuarios VALUES (2,'tu')
  14. INSERT INTO #usuarios VALUES (3,'el')
  15.  
  16. INSERT INTO #asistencia VALUES (1,1,getdate())
  17. INSERT INTO #asistencia VALUES (2,2,getdate())
  18. INSERT INTO #asistencia VALUES (3,1,dateadd(dd,-1,getdate()))
  19. INSERT INTO #asistencia VALUES (4,3,dateadd(dd,-2,getdate()))
  20.  
  21.  
  22. SELECT
  23. CASE
  24. WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
  25. CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
  26.  FROM
  27. (
  28. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  29. CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
  30. ) AS t1
  31. LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
  32. 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 original
  1. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  2. 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 original
  1. SELECT
  2. CASE
  3. WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
  4. CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
  5.  FROM
  6. (
  7. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  8. CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
  9. ) AS t1
  10. LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
  11. 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
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me