Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.

Última edición por Angel.Matilla fecha: 06-02-2018 a las 18:43:01.
Responder Con Cita
  #2  
Antiguo 06-02-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 06-02-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.020
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
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.
Responder Con Cita
  #4  
Antiguo 08-02-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Querys!!! Esmeralda Varios 4 16-12-2010 19:43:34
Querys Lupita Varios 1 06-04-2006 22:14:56
Querys y BDE geovany Conexión con bases de datos 7 14-10-2004 19:44:49
Querys neon SQL 1 29-07-2004 15:02:50
querys y ADO Dantael MS SQL Server 2 15-06-2004 23:27:49


La franja horaria es GMT +2. Ahora son las 10:05:24.


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
Copyright 1996-2007 Club Delphi