Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Querys con resultados incoherentes (https://www.clubdelphi.com/foros/showthread.php?t=92797)

Angel.Matilla 06-02-2018 17:38:09

Querys con resultados incoherentes
 
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 PHP:

SELECT DISTINCT A.CodigoC.NombreD.LiteralE.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.ValorJunta 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,

Si ejecuto este query me devuelve 55 filas, que es lo que ha de ser. Pero si lo ejecuto así:
Código PHP:

SELECT DISTINCT COUNT(A.Codigo), C.NombreD.LiteralE.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.ValorJunta 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,

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.

Angel.Matilla 06-02-2018 17:53:44

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 PHP:

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 PHP:

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 PHP:

SELECT COUNT(DISTINCT A.Codigo)... etc

Cada día se aprende algo nuevo. :(

Casimiro Notevi 06-02-2018 17:56:04

Cita:

Empezado por Angel.Matilla (Mensaje 524369)
si las condiciones son las mismas en ambas consultas el resultado debería ser el mismo

Es que no son iguales:
SELECT DISTINCT A.Codigo, C.Nombre, D.Literal, E.Literal FROM Persona A
SELECT DISTINCT COUNT(A.Codigo), C.Nombre, D.Literal, E.Literal FROM Persona A GROUP BY 2,3,4

El primero devuelve un registro por cada código distinto.
El segundo devuelve agrupado por nombre contando los códigos que corresponde a cada nombre.

Angel.Matilla 08-02-2018 12:22:02

No, si esa puntualización que me haces la conocía. Lo que no sabía es la tercera opción que he puesto, la de SELECT COUNT(DISTINCT..., que es la que me vañle. Gracias por la información.


La franja horaria es GMT +2. Ahora son las 08:00:30.

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