Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Querys con resultados incoherentes

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Querys con resultados incoherentes Responder citando

Estoy tratando de hacer una búsqueda para contra los registros que cumplen una determinada condición. Para probar he limitado la consulta a un único tipo de registro.

Tengo dos querys (ninguno de ellos es sencillo):
Código:
SELECT DISTINCT A.Codigo, C.Nombre, D.Literal, E.Literal
  FROM Persona A
  LEFT JOIN Recibos B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Codigo
  LEFT JOIN Instalacion D ON D.Etiqueta = 'Situacion' AND A.Situacion = D.Valor
  LEFT JOIN Instalacion E ON E.Etiqueta = 'ForPago' AND A.ForPago = E.Valor, Junta C
 WHERE A.Situacion IN (SELECT Valor FROM Instalacion WHERE Etiqueta = 'Situacion' AND Situacion = 1)
   AND A.Cuota > 0
   AND A.ForPago IN (SELECT Valor FROM Instalacion WHERE Etiqueta = 'ForPago' AND Literal = 'Banco')
   AND A.PerPago = (SELECT Valor FROM Instalacion WHERE Etiqueta = 'PerPago' AND Literal = 'Anual')
   AND A.Codigo NOT IN (SELECT Codigo FROM Emision)
   AND A.CodPrv = C.CodPrv AND A.Junta = C.Codigo AND C.Nombre = 'CIUDAD REAL'
 ORDER BY 2,3,4,1

Si ejecuto este query me devuelve 55 filas, que es lo que ha de ser. Pero si lo ejecuto así:
Código:
SELECT DISTINCT COUNT(A.Codigo), C.Nombre, D.Literal, E.Literal
  FROM Persona A
  LEFT JOIN Recibos B ON A.CodPrv = B.CodPrv AND A.Codigo = B.Codigo
  LEFT JOIN Instalacion D ON D.Etiqueta = 'Situacion' AND A.Situacion = D.Valor
  LEFT JOIN Instalacion E ON E.Etiqueta = 'ForPago' AND A.ForPago = E.Valor, Junta C
 WHERE A.Situacion IN (SELECT Valor FROM Instalacion WHERE Etiqueta = 'Situacion' AND Situacion = 1)
   AND A.Cuota > 0
   AND A.ForPago IN (SELECT Valor FROM Instalacion WHERE Etiqueta = 'ForPago' AND Literal = 'Banco')
   AND A.PerPago = (SELECT Valor FROM Instalacion WHERE Etiqueta = 'PerPago' AND Literal = 'Anual')
   AND A.Codigo NOT IN (SELECT Codigo FROM Emision)
   AND A.CodPrv = C.CodPrv AND A.Junta = C.Codigo AND C.Nombre = 'CIUDAD REAL'
 GROUP BY 2,3,4
 ORDER BY 2,3,4


La columna del COUNT me devuelve como resultado 412, que es de todo punto incorrecto.

Entiendo que si las condiciones son las mismas en ambas consultas el resultado debería ser el mismo, es decir que el COUNT me devolviera 55. Ya no sé que hacer para tratar de aislar el error que estoy cometiendo; me interesaría el segundo método, con un COUNT, porque es para mostrar un resultado resumen en pantalla y poder hacer unos procesos después en función de la selección del usuario. Si alguno quiere echarme una mano le puedo pasar la base de datos en FB 2.5; va por delante que el fichero comprimido ocupa más de 320 KB.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Estaba hurgando en la consulta, tratando de encontrar por qué no me da el mismo resultado. Bien: he eliminado columnas de ambas y descubierto una cosa.

Si pongo así el query:
Código:
SELECT DISTINCT A.Codigo... etc.

pero sin eliiminar ninguna de las condiciones de la misma me devuelve las 55 filas que debe. Pero si pongo:
Código:
SELECT DISTINCT COUNT(A.Codigo)... etc.

entonces me devuelve 412 en ese COUNT.

Dicho esto, acabo de descubrir que DISTINCT puede meterse dentro del COUNT y yo estaba convencido que no; es decir:
Código:
SELECT COUNT(DISTINCT A.Codigo)... etc.

Cada día se aprende algo nuevo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.