PDA

Ver la Versión Completa : Problema Con conteo de datos


JamesBond_Mx
04-07-2003, 20:29:35
Tengo la siguiente Consulta

Select Anomalias.Cve_Inst, Principal.Nombre_inst
From Anomalias, Principal
Principal Inner Join Anomalias On Principal.Cve_Inst = Anomalias.Cve_Inst
Group By Anomalias.Cve_Inst, Principal.Nombre_Inst


Esto me genera una pequeña tabla mas o menos asi:

Cve_Inst Nombre_inst
AB001 Pozo X
AB002 Pozo Y
AB003 Pozo Z
BS000 Bat. A
BS001 Bat. B

Ahora necesito saber cuantos registros hay por cada Instalación, por el momento y como efectos de prueba, tengo 24 registros solamente

1 del Pozo X
1 del Pozo Y
1 del Pozo z
1 de la Bat. A
20 de la Bateria B.

Si yo agrego un Count(Anomalias.Cve_Princ) me cuenta todo en conjunto o sea que me da el siguiente resultado:

Cve_Inst Nombre_inst Count(Anomalias.Cve_Princ)
AB001 Pozo X 24
AB002 Pozo Y 24
AB003 Pozo Z 24
BS000 Bat. A 24
BS001 Bat. B 480 ????

Y no debe ser así, para empezar. Por lo que noté el resultado real de registros que hay por instalación me lo multiplica por el numero completo de registros de la consulta, o sea en total tengo 24 registros. hice la prueba aumentado 3 registros mas y ocurre lo mismo pero a hora me los multiplica por 27.

¿como debo hacer la consulta para que me dé el resultado esperado?

De antemano, muchas gracias.

andres1569
04-07-2003, 22:58:08
Donde veo un error es en que agrupes en base a campos que no se repiten con la misma frecuencia, es decir, Anomalias.Cve_Inst y Principal.Nombre_inst no guardan una relación 1 a 1, de ahí que el SQL te agrupe primero por uno y luego por otro (las sumas por ello se incrementan una barbaridad y te multiplica número de instalaciones por número de anomalías cada uno, osea 20 - 20 - 20 - 480).

Si quieres ver cuantos anomalías tiene cada instalación, deberías agrupar sólo por la clave de instalacion (mejor incluso que por el campo Nombre_inst que es el que parece que utilizas, puesto que la clave sabes que es un valor único y requerido que no te jugará una mala pasada):

Select Principal.Cve_inst, Count(Anomalias.Cve_Inst)
From Anomalias, Principal
Principal Inner Join Anomalias On Principal.Cve_Inst = Anomalias.Cve_Inst
Group By Principal.Cve_inst

Esto te devolverá el resultado que andas buscando.

JamesBond_Mx
04-07-2003, 23:07:29
Ya probé tu consulta y el resultado sigue siendo el mismo.

Y el Problema es que necesito el Campo Nombre_Inst de la tabla Principal, para poder identificar de que Instalación se trata, por que yo sabre por medio de la clave cual es la instalación, pero un usuario cualquiera no lo sabrá, Asi que a fuerza necesito ese campo, y por ende, también necesito meterlo en el Group By, por que si no lo meto, me marca un error. Explico un poco más como estan mis tablas.

La tabla anomalias contiene las anomalias encontradas en las instalaciones, la unica referencia a la instalación es el campo Cve_inst, que es la clave de la instaalción donde se encontró la a anomalía.

La tabla Principal es donde estan las Instalaciones del distrito, la cual como clave principal es el campo Cve_Inst, tambien tiene una campo donde va el nombre de la Instalación y uno donde va el tipo de de Instalación, a mi el que me interesa utilizar de aqui es el nombre, por medio de la clave conecto las dos tablas en el inner Join y es una relación uno a varios, una instaalción tiene varias anomalias, entonces lo que yo necesito saber es cuantas anomalias tiene una instalación.

Si hago la consulta con la pura tabla Anomalias, sale muy bien, pero me pondria la clave de la anomalia, y asi no me sirve.

Me expliqué???

andres1569
04-07-2003, 23:20:05
Quizás sea la forma en que está escrita la consulta, que a mí me suena un poco extraña, no sé que BD usas, pero mira a ver si esto va mejor, omitiendo la tabla Anomalias en la cláusula FROM:

Select Principal.Cve_inst, Count(Anomalias.Cve_Inst)
From Principal
Inner Join Anomalias On Principal.Cve_Inst = Anomalias.Cve_Inst
Group By Principal.Cve_inst

JamesBond_Mx
04-07-2003, 23:30:31
Ya salió.... Gracias por tu ayuda

andres1569
04-07-2003, 23:37:54
Ya de un principio me extrañó la forma de estar escrita la consulta (aunque como algunas BD como Access tiene una forma tan particular de escribir el SQL ...). Lo que te dije de la razón por la que te devolvía esos sumatorios, mejor olvídalo, no tiene nada que ver, la razón era porque accedías dos veces a la misma tabla.