Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta con dos tablas y varios COUNT (https://www.clubdelphi.com/foros/showthread.php?t=57206)

enecumene 07-06-2008 23:51:23

Consulta con dos tablas y varios COUNT
 
Hola compañeros del foro tengo este problema, he tratado de hacer una consulta con dos tablas y varios count, me explico, en la tabla tengo los siguientes campos:

TABLA REGISTRO

REGNO (Integer)
EMPID (Integer)
EMPLEADO (varchar)
FECHA (Date)
ENTRADA (Time)
SALIDA (Time)
TARDANZA (Varchar)
PERMISO (Varchar)
LICENCIA (Varchar)
EXCUSA (Varchar)
ENFERMEDAD (Varchar)
VACACIONES (Varchar)

TABLA EMPLEADOS

ID (Integer)
NOMBRE (Varchar)
TANDA (Integer)

Estaba haciendo esta consulta:

Código SQL [-]
SELECT COUNT(R.EMPID), E.ID, E.NOMBRE, E.TANDA FROM EMPLEADOS E, REGISTRO R WHERE E.ID = R.EMPID GROUP BY E.NOMBRE, E.TANDA, E.ID

Hasta ahí la consulta va bien pero a medias y yo quiero un reporte que me cuente las tardanzas, permisos, licencias, enfermedades, excusas y vacaciones de cada empleado.

+----------------------+-------+-------+-------+
| EMPLEADO | DIAS | TARD | PER |
+----------------------+-------+-------+-------+
| FERNANDO L. | 28 | 6 | 2 |
| JUAN PEREZ | 26 | 8 | 4 |
| ROSA SUAREZ | 30 | 1 | 0 |
+----------------------+-------+-------+-------+

Ese es un ejemplo de cómo debería ser el reporte, estoy trabajando con Firebird 2.0 y Delphi 7.

Saludos.

pcicom 08-06-2008 04:13:05

Ahi te va...

Código SQL [-]

SELECT E.ID,E.NOMBRE,E.TANDA,COUNT(R.ENTRADA),
  COUNT(R.SALIDA),
  COUNT(R.TARDANZA),
  COUNT(R.PERMISO),
  COUNT(R.LICENCIA),
  COUNT(R.EXCUSA),
  COUNT(R.ENFERMEDAD),
  COUNT(R.VACACIONES) 
FROM REGISTRO R, EMPLEADOS E
WHERE E.ID=R.EMPID GROUP BY 1,2,3

enecumene 18-06-2008 21:12:27

Amigo PCicom, perdón por la tardanza, estaba ocupado en otro proyecto, vale, acabo de probar la sentencia, pues mira que me ha funcionado bien, pues me intrigaba si tomaría los valores nulos o no.

Fíjate, tengo otro caso con la misma sentencia, el campo EXCUSA se rellena con dos datos: [S] y [N], ¿como podría hacer el conteo por separado?, ¿con un subquery en el select?.

Saludos.

RolphyReyes 18-06-2008 21:51:06

Saludos.

Para validar los valores nulos puedes utilizar COALESCE(COUNT(CAMPO),0).

Para lo del campo Excusa utiliza la sentencia CASE .... WHEN con esto solucionas tu problema.

Hasta luego.

enecumene 19-06-2008 21:13:04

1 Archivos Adjunto(s)
Gracias Rolphy, haciendo uso del CASE...WHEN en cierto sentido me funciona, aqui dejo la sentencia:

Código SQL [-]
SELECT E.ID,E.NOMBRE,E.TANDA,COUNT(R.ENTRADA),
  COUNT(R.TARDANZA),
  COUNT(R.PERMISO),
  COUNT(R.LICENCIA),
  COUNT(R.ENFERMEDAD),
  COUNT(R.VACACIONES),
  CASE WHEN R.EXCUSA = 'S'
  THEN COUNT(R.EXCUSA)
  ELSE 0
  END AS EXCS,
  CASE WHEN R.EXCUSA = 'N'
  THEN COUNT(R.EXCUSA)
  ELSE 0
  END AS EXCN
  FROM REGISTRO R, EMPLEADOS E
WHERE E.ID=R.EMPID GROUP BY E.ID,E.NOMBRE,E.TANDA,R.EXCUSA

Pero me esta sucediendo un problema, y es que me duplica los empleados en base a los datos del CASE...WHEN por separado, aqui dejo un ejemplo de como me está quedando.

Archivo Adjunto 1289

lo que busco es todos los datos esten en una misma fila en un solo empleado. Bueno espero que con el ejemplo sea mas entendible, porque hoy estoy espeso para escribir.

Saludos.

enecumene 20-06-2008 01:58:38

Bueno, lo último que he hecho es lo siguiente:

Código SQL [-]
SELECT E.ID, E.NOMBRE, E.TANDA,
  COUNT(R.ENTRADA),
  COUNT(R.TARDANZA),
  COUNT(R.PERMISO),
  COUNT(R.LICENCIA),
  COUNT(R.ENFERMEDAD),
  COUNT(R.VACACIONES),
  COUNT((SELECT COUNT(R.EXCUSA) FROM REGISTRO R WHERE R.EXCUSA = 'S')) AS EXCS,
  COUNT((SELECT COUNT(R.EXCUSA) FROM REGISTRO R WHERE R.EXCUSA = 'N')) AS EXCN
  FROM EMPLEADOS E, REGISTRO R WHERE E.ID = R.EMPID GROUP BY E.NOMBRE,E.ID,E.TANDA

Pero me cuenta todos:
Cita:

+----------------------+-------+-------+----+------+
| EMPLEADO | DIAS | TARD | PER | EXCS | EXCN |
+----------------------+-------+-----+------+------+
| FERNANDO L. | 28 | 6 | 2 | 2 | 2 |
| JUAN PEREZ | 26 | 8 | 4 | 2 | 2 |
| ROSA SUAREZ | 30 | 1 | 0 | 2 | 2 |
+----------------------+-------+-----+------+------+
Vamos chicos un empujoncito, ;)

Saludos.

PD. No sé por qué el cuadro no me sale en orden.

pcicom 20-06-2008 06:39:06

Asi o mas Simple....

Código SQL [-]
Select E.id,e.nombre,e.tanda,count(r.entrada),
  Count(r.salida),
  Count(r.tardanza),
  Count(r.permiso),
  Count(r.licencia),
  Count(case When R.excusa='s' Then 1 Else 0) As Escusa_si,
  Count(case When R.excusa='n' Then 1 Else 0) As Escusa_no,
  Count(r.enfermedad),
  Count(r.vacaciones) 
From Registro R, Empleados E
Where E.id=r.empid Group By 1,2,3

Uff esto de pensar me esta cansando.... quemando neuronas.... free

enecumene 20-06-2008 20:50:52

Gracias amigo PCicom, haciendole algunas modificaciones porque me daba errores de sintaxis, quedó así:

Código SQL [-]
SELECT E.ID,E.NOMBRE,E.TANDA,COUNT(R.ENTRADA),
  COUNT(R.TARDANZA),
  COUNT(R.PERMISO),
  COUNT(R.LICENCIA),
  COUNT(R.ENFERMEDAD),
  COUNT(R.VACACIONES),
  COUNT(CASE R.EXCUSA WHEN 'S' THEN 1 Else 0 END) As EXCUSA_SI,
  COUNT(CASE R.EXCUSA WHEN 'N' THEN 1 Else 0 END) As EXCUSA_NO
  FROM REGISTRO R, EMPLEADOS E
WHERE E.ID=R.EMPID GROUP BY E.NOMBRE,E.ID,E.TANDA,R.EXCUSA

Pero aún así sigue el mismo problema, ya estoy casi cambiando la estructura de la tabla, deberé separar los datos en campos diferentes :eek:.

Saludos.

RolphyReyes 20-06-2008 21:32:30

Saludos.

Porque utilizas el campo Excusa en el Group By?

Intenta a sacar el campo y luego avisas como vas.

enecumene 20-06-2008 21:35:54

Gracias amigo Rolphy, pues no me había fijado, ahora no me repite y caen en una sola fila, pero el conteo no es el correcto me da la misma cantidad que la columna Dias del Reporte.

Saludos.

RolphyReyes 20-06-2008 22:36:55

Saludos.

Enecumene trata con la siguiente sentencia:

Código SQL [-]
SELECT SUM(CASE TIPO WHEN 'E' THEN 1 ELSE 0 END) TIPOE,
       SUM(CASE TIPO WHEN 'S' THEN 1 ELSE 0 END) TIPOS,
       SUM(CASE TIPO WHEN 'X' THEN 1 ELSE 0 END) TIPOX
FROM EMPLEADOS

Sustituye por SUM los COUNT y utilizas CASE para preguntar por el valor y cuéntanos luego.

Suerte!!!


La franja horaria es GMT +2. Ahora son las 16:28:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi