Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #2  
Antiguo 08-06-2008
pcicom pcicom is offline
Miembro
 
Registrado: may 2003
Ubicación: MONTERREY MEXICO
Posts: 253
Poder: 22
pcicom Va por buen camino
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
__________________
Poco ha de saber el que no pregunta.. Yo por eso soy un pregunton
Responder Con Cita
  #3  
Antiguo 18-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #4  
Antiguo 18-06-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Exclamation

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.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #5  
Antiguo 19-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.

reporte.zip

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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #6  
Antiguo 20-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #7  
Antiguo 20-06-2008
pcicom pcicom is offline
Miembro
 
Registrado: may 2003
Ubicación: MONTERREY MEXICO
Posts: 253
Poder: 22
pcicom Va por buen camino
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
__________________
Poco ha de saber el que no pregunta.. Yo por eso soy un pregunton
Responder Con Cita
  #8  
Antiguo 20-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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 .

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #9  
Antiguo 20-06-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Saludos.

Porque utilizas el campo Excusa en el Group By?

Intenta a sacar el campo y luego avisas como vas.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #10  
Antiguo 20-06-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #11  
Antiguo 20-06-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

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!!!
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
select count con varios campos aanil SQL 4 17-05-2008 02:37:18
Consulta SQL - Sum - Count - Otros BlueSteel SQL 5 10-10-2007 18:23:13
Consulta errada con COUNT Jose Roman SQL 1 21-07-2007 17:51:55
Consulta en relación a count y group by en dos tablas Albano MySQL 3 11-05-2007 00:04:34
varios count pepe2000 SQL 7 16-02-2005 18:16:51


La franja horaria es GMT +2. Ahora son las 04:30:25.


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
Copyright 1996-2007 Club Delphi