SQL - Conteo de registros no existentes.

 
Vista:
sin imagen de perfil

Conteo de registros no existentes.

Publicado por Alan (3 intervenciones) el 27/01/2015 17:26:02
Hola buen día.
Mi consulta es la siguiente.
Estoy agregando un modulo a un sistema que otro desarrollador hizo y no cuento con el codigo fuente de lo ya hecho por lo que la estructura de la base no puedo modificarla drasticamente y eso me limita bastante. básicamente esta consulta la requiero en una grafica.


Tengo una tabla llamada ventas en donde se guarda prácticamente todos los datos del sistema (no se a quien se le ocurrió hacerla así pero en fin), en esa tabla hago un conteo de cuantas ventas tiene cada empresa. Hasta ahí todo bien, pero resulta que recién "limpiaron" la base de datos y ya no hay registros por lo que la consulta no devuelve ningún valor. sin embargo en mi consulta yo quiero que me devuelva el valor de cada empresa que incluya en mi clausula where.

puede hacerce esto ?

digamos tengo mi consulta:

SELECT EMPRESA,VENT(COUNT) AS [CONTEO] from VENTAS where EMPRESA='SUPER COLA S.A. DE C.V.' GROUP BY EMPRESA

y como la base esta en blanco y esa empresa no se encuentra registrada la consulta no me devuelve ningun valor entonces lo que quiero que me devuelva es:
_________________________________
|EMPRESA | CONTEO |
_________________________________
SUPER COLA S.A DE C.V. | 0
_________________________________|

saludos y gracias anticipadas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Conteo de registros no existentes.

Publicado por leonardo_josue (1173 intervenciones) el 27/01/2015 18:09:14
Hola Alan:

En primer lugar, ¿con qué motor de BD's estás trabajando? la verdad estoy tratando de entender la consulta que pones, pero nunca había visto algo asi:

1
VENT(COUNT) AS [CONTEO]

Supongo que esto es solo un ejemplo y no la consulta que en realidad estás tratando de ejecutar, pues COUNT en SQL es una función de agrupación y no se utiliza de la manera en que lo estás haciendo o_O

Ahora buen, la consulta que pretendes hacer no es posible (al menos no con una sola tabla)... SQL funciona sólo sobre información que existe en las tablas, no tiene la capacidad de "inventar" información. En tu caso, si el registro para la empresa SUPER COLA S.A. DE C.V. NO EXISTE EN LA TABLA DE VENTAS, entonces el resultado es NULL, no hay forma de poder regresar lo que pretendes...

Ahora bien, hay una forma de obtener lo que quieres, pero implicaría necesariamente la utilización de otra tabla, la cual contenga el nombre de la empresa que quieres consultar. Si tienes un catálogo de empresas, puedes hacer uso de este y simplemente hacer un LEFT JOIN, en caso contrario en lugar de poner la condición en el WHERE, puedes crear una tabla temporal con este registro para poder hacer el LEFT JOIN... funcionaría asi. Supongamos que tienes la siguiente información:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM empresas;
+------------+-------------------------+
| id_empresa | nombre_empresa          |
+------------+-------------------------+
|          1 | ACME S.A. de C.V.       |
|          2 | EMPRESA PATITO          |
|          3 | SUPER COLA S.A. DE C.V. |
+------------+-------------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM ventas;
+----------+------------+-------------------+------------------+
| id_venta | id_empresa | descripcion_venta | cantidad_vendida |
+----------+------------+-------------------+------------------+
|        1 |          1 | uno               |               10 |
|        2 |          1 | dos               |               20 |
|        3 |          2 | tres              |               30 |
+----------+------------+-------------------+------------------+
3 rows in set (0.00 sec)

De la tabla VENTAS, se observa que la empresa 1 tiene dos ventas, y la empresa 2 tiene 1, sin embargo la empresa 3 NO TIENE NINGUNA VENTA REGISTRADA, por lo tanto, puedes hacer un LEFT JOIN para encontrar el número de ventas de cada empresa:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT e.id_empresa, e.nombre_empresa, COUNT(id_venta) total_ventas
    -> FROM empresas e
    -> LEFT JOIN ventas v ON e.id_empresa = v.id_empresa
    -> GROUP BY e.id_empresa, e.nombre_empresa;
+------------+-------------------------+--------------+
| id_empresa | nombre_empresa          | total_ventas |
+------------+-------------------------+--------------+
|          1 | ACME S.A. de C.V.       |            2 |
|          2 | EMPRESA PATITO          |            1 |
|          3 | SUPER COLA S.A. DE C.V. |            0 |
+------------+-------------------------+--------------+
3 rows in set (0.00 sec)

haz la prueba y nos comentas.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Conteo de registros no existentes.

Publicado por Alan (3 intervenciones) el 27/01/2015 23:53:29
Hola Leo muchas gracias por responder.
Efectivamente la consulta que publique esta mal, en mi intento de hacer mi pregunta mas sencilla con el tipico ejemplo de ventas se me fue ese error garrafal jeje. una disculpa.

Complementando mi duda: Trabajo con SQL Server 2008 una disculpa tambien por poner mi duda aqui y no en el foro de SQL Server.

Como sea veo que si me entendiste en mi problema, por lo que para una mejor solucion creo que es mejor que lo ponga con datos y tablas reales.

VISTA GENERALVIEW:(Contiene todos los datos del sistema, contiene valores nulos, registros incompletos etc 'una porqueria pero es lo que hay') y lo que interesa es hacer el conteo ya sea que las filas esten completas o incompletas.


Nota1: La vista la he creado yo para tener mas organizados los datos sin embargo sigue siendo solo una consulta de una tabla.

Nota2: No encuentro ningun identificador dentro de la vista/tabla para poderlo ligar con la tabla que me sugieres crear por lo que lo he ligado unicamente con el campo [ENTE].

Haciendo lo que me recomiendas he creado una tabla llamada CATALOGOAUX en donde he cargado todas las empresas que quiero se muestren. van en el campo [ENTE1]. al momento de crear mi consulta quedo de la siguiente forma:

select g.[ENTE], COUNT([ENTE]) as[CONTEO] FROM GeneralView g LEFT JOIN CATALOGOAUX c ON g.ENTE = c.ENTE1 GROUP BY G.ENTE

El resultado del query me lo manda de una manera extraña ya que me arroja unicamente los registros que existen en la vista generalview ignorando los que faltan de la tabla CATALOGAUX pero en la columna Conteo me modifica los valores en algunos y me los pone dobles es decir si el conteo real es de 6, al aplicar la consulta Conteo marca 12.

Saludos! Sigo experimentando con las sentencias RIGHT JOIN, INNER JOIN, LEFT JOIN sin obtener el resultado que espero.

Lamentablemente no puedo postear imagenes debido a que maneja datos delicados, espero me puedas ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Conteo de registros no existentes.

Publicado por leonardo_josue (1173 intervenciones) el 28/01/2015 16:41:14
Hola de nuevo Alan:

Para entender mejor el concepto de JOIN, puedes preguntarle a SANTA WIKIPEDIA:

http://es.wikipedia.org/wiki/Join

Ella por lo general atiende tus plegarias y te brinda las respuestas que buscas... y si no fuera así, también puedes encomendarte a SAN GOOGLE :D

El realidad tu consulta está correcta... lo único que tienes que cuidar es el orden en que pones las tablas. Cuando utilizas un LEFT JOIN, la tabla "completa" es decir, la que contiene todos los elementos que quieres que se muestren deben de ir en el FROM... la tabla que está "incompleta" es decir, donde puede o no puede aparecer los elementos debes colocarla en el LEFT. Prueba la consulta de esta manera:

1
2
3
4
SELECT c.[ENTE], COUNT([g.ENTE]) as[CONTEO]
FROM  CatalogoAux c
LEFT JOIN GeneralView g ON g.ENTE = c.ENTE1
GROUP BY g.ENTE

Ahora bien, algunas observaciones adicionales de acuerdo a lo que comentas en tu post:

1
No encuentro ningun identificador dentro de la vista/tabla para poderlo ligar con la tabla que me sugieres crear por lo que lo he ligado unicamente con el campo [ENTE].

Mucho ojo, por lo que comentas, tu campo ENTE contiene una descripción, por lo tanto debes tener mucho cuidado en la manera en que comparas estos campos. Cuando se habla de Cadenas, no es lo mismo

1
(SOLO, Solo, solo, SoLO, sOLo, sólo, SÓLO..........)

es decir, colocar mayúsculas, minúsculas o acentos hacen que las cadenas sean distintas... es por eso que se recomienda siempre el uso de catálogos y llaves... en tu caso, debes tener cuidado en cuanto a las cadenas que quieres comparar. Una práctica común a la hora de comparar cadenas es convertir todo a mayúsculas o minúsculas, para minimizar estos problemas, pero no te garantiza que no existan del todo.

1
la columna Conteo me modifica los valores en algunos y me los pone dobles es decir si el conteo real es de 6, al aplicar la consulta Conteo marca 12.

Este comportamiento de "duplicar" los resultados, puede ser ocasionado por la forma en que estabas haciendo el LEFT JOIN o también puede ser porque se está haciendo un PRODUCTO CARTESIANO entre tus tablas... (en la liga del JOIN está explicado en qué consiste un producto cartesiano, busca CROSS JOIN). Para evitar estos, debes cuidar que se coloquen todas las posibles "llaves" que tengas entre tus tablas.

Haz la prueba y nos comentas

Saludos.
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Conteo de registros no existentes.

Publicado por leonardo_josue (1173 intervenciones) el 28/01/2015 17:47:26
Hola de Nuevo:

Hay un error en la consulta que puse para que pruebes, y es el el GROUP BY... observa que aparece el campo g.ENTE, sin embargo, de hacer esto, seguirá mostrando sólamente aquellos que existan en la tabla GeneralView. La consulta debería quedar así:

1
2
3
4
SELECT c.[ENTE], COUNT([g.ENTE]) as[CONTEO]
FROM  CatalogoAux c
LEFT JOIN GeneralView g ON g.ENTE = c.ENTE1
GROUP BY c.ENTE

Observa que el SELECT y el GROUP BY, son coincidentes en el campo... y este campo pertenece a la tabla que está en el FROM, de esta manera NO IMPORTA que no se encuentren en la tabla GENERALVIEW, siempre se van a mostrar... en el COUNT, si pones la referencia a la tabla del LEFT, ya que es la que te interesa contar.

Saludos y nos comentas los resultados.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Conteo de registros no existentes.

Publicado por Alan (3 intervenciones) el 30/01/2015 00:56:11
Excelente! muchas gracias Leo ahora ya comprendo mas esto del inner join. créeme que hay un montón de consultas mas que tengo que hacer pero con tu ayuda me has ahorrado fácilmente mas de la mitad.
Me da mucho gusto que esta es la primer duda que posteo en el foro e inmediatamente me brindaste asistencia.
Al final mi consulta quedo asi:

SELECT c.[ENTE1], COUNT(g.[ENTE]) as[CONTEO]
FROM CATALOGOAUX c
LEFT JOIN GeneralView g ON g.ENTE = c.ENTE1
GROUP BY c.ENTE1

de la consulta que me obsequiaste solo cambie esto: COUNT([g.ENTE]) por COUNT(g.[ENTE]) ya que sql marcaba error.

Me has salvado como no tienes una idea, muchísimas gracias por tu ayuda Leo.
Ya tenia días buscando en google como hacer esto pero no veía algo claro. Tanta información en google y tras intensas pruebas y fallas finalmente le has dado en el clavo.
Prometo devolver el favor aportando y ayudando en esta grandiosa comunidad de programadores.
Saludos desde México!

Alan H.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar