Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Select count para registros en cero

Estas en el tema de Select count para registros en cero en el foro de SQL Server en Foros del Web. HOLA! TENGO UNA DUDA QUE ME A DADO MUCHO DOLORES DE CABEZA! TENGO UNA TABLA QUE SE LLAMA exp_ti_bitacora_proyectores DONDE ALMACENO BIENES POR MEDIO DE ...
  #1 (permalink)  
Antiguo 08/03/2016, 10:20
 
Fecha de Ingreso: marzo-2016
Ubicación: En algun lugar de Mexico
Mensajes: 6
Antigüedad: 8 años, 1 mes
Puntos: 0
Select count para registros en cero

HOLA! TENGO UNA DUDA QUE ME A DADO MUCHO DOLORES DE CABEZA!

TENGO UNA TABLA QUE SE LLAMA exp_ti_bitacora_proyectores DONDE ALMACENO BIENES POR MEDIO DE UNA cve_bien Y ALMACENO UN CAMPO LLAMADO revision_proyectores DONDE EL VALOR 0 SIGNIFICA ATENCIÓN Y EL 1 SIGNIFICA REVISIÓN, NECESITO HACER UNA CONSULTA DONDE ME CUENTE EL NUMERO DE ATENCIONES Y REVISIONES QUE A TENIDO CADA BIEN ENTRE UN RANGO DE FECHAS, INCLUSO AQUELLAS QUE ESTEN EN CERO, ES DECIR QUE SI EL BIEN '100' TIENE SOLO UN REGISTRO EN revision_proyectores CON VALOR 1, ME DEVUELVA LO SIGUIENTE:

CVE_BIEN ATENCIONES REVISIONES
100 0 1

ESTO LO HE LOGRADO CON LA SIGUIENTE CONSULTA:

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(CASE WHEN revision_proyectores = 0 THEN 1 END) AS ATENCIONES_CUANTOS_CEROS,
  3. COUNT(CASE WHEN revision_proyectores = 1 THEN 1 END) AS REVISIONES_CUANTOS_UNOS,
  4. COUNT(cve_bien) AS TOTALES
  5. FROM exp_ti_bitacora_proyectores
  6. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  7. AND CONVERT(DATETIME,'07/03/2016', 102))
  8. GROUP BY cve_bien

PERO QUIERO UNA DONDE NO UTILICE EL CASE WHEN.... HE HECHO LA SIGUIENTE PERO NO ME DEVUELVE LO MISMO.... ALGUIEN PODRIA DECIRME QUE ME FALTA PARA LOGRARLO? ESQ ME OMITE LOS CEROS

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(cve_bien) AS ATENCIONES
  3. FROM exp_ti_bitacora_proyectores
  4. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  5. AND CONVERT(DATETIME,'07/03/2016', 102)) AND revision_proyectores = 0
  6. GROUP BY cve_bien

Última edición por gnzsoloyo; 08/03/2016 a las 10:43
  #2 (permalink)  
Antiguo 08/03/2016, 10:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Select count para registros en cero

Dado el tipo de funciones de fecha usadas, he movido el posts al foro más específico (SQL Server).
Por favor, NO USES MAYUSCULAS PURAS en el mensaje. Es lo mismo que GRITAR.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/03/2016, 10:49
 
Fecha de Ingreso: marzo-2016
Ubicación: En algun lugar de Mexico
Mensajes: 6
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Select count para registros en cero

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Dado el tipo de funciones de fecha usadas, he movido el posts al foro más específico (SQL Server).
Por favor, NO USES MAYUSCULAS PURAS en el mensaje. Es lo mismo que GRITAR.
Perfecto, gracias! Soy nuevo en el foro, prometo aprender.
  #4 (permalink)  
Antiguo 08/03/2016, 10:56
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Select count para registros en cero

¿Porque no quieres hacer uso del CASE WHEN, si te da el resultado?
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 08/03/2016, 10:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select count para registros en cero

La misma pregunta que iislas, porque no quieres usar el case? ahora para tu problema prueba con esto:

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(*) AS ATENCIONES
  3. FROM exp_ti_bitacora_proyectores
  4. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  5. AND CONVERT(DATETIME,'07/03/2016', 102)) AND revision_proyectores = 0
  6. GROUP BY cve_bien
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 08/03/2016, 11:09
 
Fecha de Ingreso: marzo-2016
Ubicación: En algun lugar de Mexico
Mensajes: 6
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Select count para registros en cero

Cita:
Iniciado por iislas Ver Mensaje
¿Porque no quieres hacer uso del CASE WHEN, si te da el resultado?
Hola, gracias por responder!

Pues de hecho batalle varios días para dar con el uso del CASE WHEN y logre sacarlo pero mi jefe dice que utilizandolo hago un recorrido en TODOS los registros y valido si es un cero o un uno, y que si tenemos miles de registros la consulta se vuelve algo ineficiente, que debo utilizar una donde vaya directo a los registro que quiero consultar validando todo en el WHERE, pero no se como lo puedo hacer con la estructura que estoy utilizando, para mi ya estaria bien asi porque no se hacen demasiados registros en la tabla y aparte se le da un rango de fechas que normalmente se utilizara por mes, pero pues ya saben, hay que obedecer jaja
  #7 (permalink)  
Antiguo 08/03/2016, 11:10
 
Fecha de Ingreso: marzo-2016
Ubicación: En algun lugar de Mexico
Mensajes: 6
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Select count para registros en cero

Cita:
Iniciado por Libras Ver Mensaje
La misma pregunta que iislas, porque no quieres usar el case? ahora para tu problema prueba con esto:

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(*) AS ATENCIONES
  3. FROM exp_ti_bitacora_proyectores
  4. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  5. AND CONVERT(DATETIME,'07/03/2016', 102)) AND revision_proyectores = 0
  6. GROUP BY cve_bien
Hola, gracias por responder!

Pues de hecho batalle varios días para dar con el uso del CASE WHEN y logre sacarlo pero mi jefe dice que utilizandolo hago un recorrido en TODOS los registros y valido si es un cero o un uno, y que si tenemos miles de registros la consulta se vuelve algo ineficiente, que debo utilizar una donde vaya directo a los registro que quiero consultar validando todo en el WHERE, pero no se como lo puedo hacer con la estructura que estoy utilizando, para mi ya estaria bien asi porque no se hacen demasiados registros en la tabla y aparte se le da un rango de fechas que normalmente se utilizara por mes, pero pues ya saben, hay que obedecer jaja

Y ya he intentado eso pero me sigue omitiendo los que tienen cero...
  #8 (permalink)  
Antiguo 08/03/2016, 11:13
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select count para registros en cero

Si vas a sacar los que tienen 0 y 1 y mostrarlos no se donde dice que esta la ineficiencia de la consulta, digo a mi parecer esta bien con el case y el when a menos que solo quieras sacar los valores de 1 o de 0 en consultas separadas :P, podrias poner un pequeño ejemplo de tus datos para ver donde no te esta respetando la condicion en el where???

y prueba con esto:

Código SQL:
Ver original
  1. SELECT
  2. COUNT(*)
  3. FROM exp_ti_bitacora_proyectores
  4. WHERE revision_proyectores = 0

Ahi te tendria que regresar el total de registros con 0

mira este ejemplo:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. nombre VARCHAR(20),
  4. valor INT
  5. )
  6.  
  7. INSERT INTO #temp VALUES ('Libras',1)
  8. INSERT INTO #temp VALUES ('Libras1',0)
  9. INSERT INTO #temp VALUES ('Libras1',0)
  10. INSERT INTO #temp VALUES ('Libras2',1)
  11. INSERT INTO #temp VALUES ('Libras2',1)
  12. INSERT INTO #temp VALUES ('Libras1',0)
  13. INSERT INTO #temp VALUES ('Libras1',1)
  14. INSERT INTO #temp VALUES ('Libras3',0)
  15. INSERT INTO #temp VALUES ('Libras3',0)
  16. INSERT INTO #temp VALUES ('Libras3',1)
  17.  
  18.  
  19. SELECT COUNT(nombre) AS conteo, nombre FROM #temp WHERE valor=0 GROUP BY nombre

El resultado:

conteo nombre
3 Libras1
2 Libras3

Estas usando fechas en el where, estas seguro que en esas fechas hay valores con 0????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 08/03/2016 a las 11:21
  #9 (permalink)  
Antiguo 08/03/2016, 11:31
 
Fecha de Ingreso: marzo-2016
Ubicación: En algun lugar de Mexico
Mensajes: 6
Antigüedad: 8 años, 1 mes
Puntos: 0
Respuesta: Select count para registros en cero

Si mira, muchas gracias antes que nada!

Mi primer consulta:

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(CASE WHEN revision_proyectores = 0 THEN 1 END) AS ATENCIONES_CUANTOS_CEROS,
  3. COUNT(CASE WHEN revision_proyectores = 1 THEN 1 END) AS REVISIONES_CUANTOS_UNOS,
  4. COUNT(cve_bien) AS TOTALES
  5. FROM exp_ti_bitacora_proyectores
  6. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  7. AND CONVERT(DATETIME,'07/03/2016', 102))
  8. GROUP BY cve_bien

Me devuelve lo siguiente:

00100 2 8 10
00197 3 0 3
12111 6 1 7
14396 1 1 2
14794 0 1 1

Donde las columnas son: cve_bien, atenciones, revisiones y total
Marque con ROJO el registro que me interesa, solo es uno y tiene la clave 14794 y en revision_proyectores tiene un 1, osea que tiene cero ceros!(valga la redundancia..)

Y mi segunda consulta:

Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(cve_bien) AS ATENCIONES
  3. FROM exp_ti_bitacora_proyectores
  4. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  5. AND CONVERT(DATETIME,'07/03/2016', 102))AND revision_proyectores = 0
  6. GROUP BY cve_bien

Me devuelve lo siguiente:

00100 2
00197 3
12111 6
14396 1

Donde las columnas son: cve_bien, atenciones
Y aqui si te das cuenta, me omite el registro 14794 que deberia aparecerme con un cero! :/

Última edición por Aguirre2422; 08/03/2016 a las 11:39 Razón: Por favor, USAR LOS HIGHLIGHT "SQL" para que el código se pueda leer bien.
  #10 (permalink)  
Antiguo 08/03/2016, 11:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select count para registros en cero

Revisando tus datos:



Código SQL:
Ver original
  1. SELECT cve_bien,
  2. COUNT(CASE WHEN revision_proyectores = 0 THEN 1 END) AS ATENCIONES_CUANTOS_CEROS,
  3. COUNT(CASE WHEN revision_proyectores = 1 THEN 1 END) AS REVISIONES_CUANTOS_UNOS,
  4. COUNT(cve_bien) AS TOTALES
  5. FROM exp_ti_bitacora_proyectores
  6. WHERE (fecha_trabajo BETWEEN CONVERT(DATETIME,'01/02/2016', 102)
  7. AND CONVERT(DATETIME,'07/03/2016', 102))
  8. GROUP BY cve_bien


cve 0's 1's Total
00100 2 8 10
00197 3 0 3
12111 6 1 7
14396 1 1 2
14794 0 1 1


El registro en negritas no tiene un valor 0 tiene nada mas un valor en 1 como quieres que este aparezca en los 0's si no tiene registro en esa columna???

Ya que si quieres que aparezca el registro con un conteo de 0 se puede hacer algo como esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. nombre VARCHAR(20),
  4. valor INT
  5. )
  6.  
  7. INSERT INTO #temp VALUES ('Libras',1)
  8. INSERT INTO #temp VALUES ('Libras1',0)
  9. INSERT INTO #temp VALUES ('Libras1',0)
  10. INSERT INTO #temp VALUES ('Libras2',1)
  11. INSERT INTO #temp VALUES ('Libras2',1)
  12. INSERT INTO #temp VALUES ('Libras1',0)
  13. INSERT INTO #temp VALUES ('Libras1',1)
  14. INSERT INTO #temp VALUES ('Libras3',0)
  15. INSERT INTO #temp VALUES ('Libras3',0)
  16. INSERT INTO #temp VALUES ('Libras3',1)
  17.  
  18.  
  19. SELECT DISTINCT nombre, 0 AS total FROM #temp WHERE nombre NOT IN(
  20. SELECT nombre
  21. FROM #temp WHERE valor=0 GROUP BY nombre
  22. )
  23. UNION
  24. SELECT nombre, COUNT(*) AS total
  25. FROM #temp WHERE valor=0 GROUP BY nombre

Resultado:
nombre total
Libras 0
Libras1 3
Libras2 0
Libras3 2

Si te fijas para Libras y Libras2 no hay registros con un cero por lo cual aparecerian con 0 ceros :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 08/03/2016 a las 15:21

Etiquetas: bases-de-datos-general, cero, count, registros, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:17.