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)
-   -   No veo el error en este query (https://www.clubdelphi.com/foros/showthread.php?t=96178)

Angel.Matilla 31-03-2023 13:34:07

No veo el error en este query
 
Tengo una BB.DD. en FB 2.5 y con estas tres tablas:
Código SQL [-]
  • CREATE TABLE Partidos (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Codigo SMALLINT NOT NULL, Nombre VARCHAR(45) NOT NULL, Sigla VARCHAR(10), Activo SMALLINT DEFAULT 1, Color INTEGER DEFAULT 0)
  • CREATE TABLE Resultados (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Proceso INTEGER NOT NULL, Mesa INTEGER NOT NULL, Partido INTEGER DEFAULT 1 NOT NULL, Votos INTEGER DEFAULT 0)
  • CREATE TABLE NumElectos (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Proceso INTEGER NOT NULL, Tipo VARCHAR(2) NOT NULL, Circunscripcion INTEGER DEFAULT 1 NOT NULL, Partido INTEGER DEFAULT 1 NOT NULL, Cargo INTEGER NOT NULL, Electos INTEGER NOT NULL)
Si ejecuto este query:
Código SQL [-]
SELECT SUM(A.Votos) Votos, B.Sigla, SUM(COALESCE(C.Electos, 0)) Electos,
       CASE WHEN B.Codigo = -3 THEN 2 WHEN B.Codigo = -1 THEN 1 WHEN B.Codigo = -2 THEN 0 ELSE 3 END Orden 
  FROM Partidos B, Resultados A
  LEFT JOIN NumElectos C ON A.CodPrv = C.CodPrv AND A.Proceso = C.Proceso AND A.Partido = C.Partido AND C.Tipo = 'J'
 WHERE A.CodPrv = :PrvIns 
   AND A.Proceso = :Proceso 
   AND A.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv 
                     AND Municipio IN (SELECT Codigo FROM Poblacion WHERE CodPrv = A.CodPrv AND Cpostal STARTING :Cpostal)) 
   AND A.CodPrv = B.CodPrv AND A.Partido = B.Codigo
 GROUP BY Sigla, Orden ORDER BY Orden DESC, Electos DESC, Votos DESC
me da estos resultados (parte):
Cita:


VOTOS SIGLA ELECTOS ORDEN
981304 PSOE 11264 3
532962 PP 7020 3

pero si lo ejecuto así:
Código SQL [-]
SELECT SUM(A.Votos) Votos, B.Sigla,
       CASE WHEN B.Codigo = -3 THEN 2 WHEN B.Codigo = -1 THEN 1 WHEN B.Codigo = -2 THEN 0 ELSE 3 END Orden 
  FROM Partidos B, Resultados A
 WHERE A.CodPrv = :PrvIns 
   AND A.Proceso = :Proceso 
   AND A.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv 
                     AND Municipio IN (SELECT Codigo FROM Poblacion WHERE CodPrv = A.CodPrv AND Cpostal STARTING :Cpostal)) 
   AND A.CodPrv = B.CodPrv AND A.Partido = B.Codigo
 GROUP BY Sigla, Orden ORDER BY Orden DESC, Votos DESC
el resultado es este otro:
Cita:


VOTOS SIGLA ORDEN
122663 PSOE 3
88827 PP 3

datos estos últimos que son los correctos y no entiendo por qué por el hecho de meter ese LEFT JOIN se obtiene diferente resultado.

mamcx 31-03-2023 17:22:50

"LEFT JOIN" *puede* producir NULLS para el resultado del lado DERECHO para cuando no hay coincidencias, y eso aumenta las filas del IZQUIERDO.

Lo cual altera los resultados que hagas con eso.

Mira un diagrama de JOINS para comprender.

Angel.Matilla 31-03-2023 18:36:59

Gracias. No se me había ocurrido. Haré un SELECT sin el SUM a ver que sale.

Angel.Matilla 31-03-2023 19:45:39

Cita:

Empezado por mamcx (Mensaje 550932)
"LEFT JOIN" *puede* producir NULLS para el resultado del lado DERECHO para cuando no hay coincidencias, y eso aumenta las filas del IZQUIERDO.

Lo cual altera los resultados que hagas con eso.

Mira un diagrama de JOINS para comprender.

Le he quitado el LEFT JOIN, dejando el query así:
Código SQL [-]
SELECT SUM(A.Votos) Votos, B.Sigla, SUM(COALESCE(C.Electos, 0)) Electos,
       CASE WHEN B.Codigo = -3 THEN 2 WHEN B.Codigo = -1 THEN 1 WHEN B.Codigo = -2 THEN 0 ELSE 3 END Orden 
  FROM Partidos B, Resultados A, NumElectos C
etc.
y ahora sólo me da dos filas, lo que por otra parte es lógico ya que sólo dos partidos tienen datos en las tres columnas, pero me sigue sacando la burrada de antes de 11264 electos. Tiene que haber una solución.

Angel.Matilla 31-03-2023 19:57:17

Cita:

Empezado por Angel.Matilla (Mensaje 550929)
Tengo una BB.DD. en FB 2.5 y con estas tres tablas:

Voy más allá: sólo sale mal la información de los valores que tiene datos para las tres columnas. Esta pantalla es cuando se ejecuta el primer query, el que da error:

y esta otra el del otro:

Como podéis ver, salvo las dos primeras filas, la información es la misma. No lo entiendo, es como si pasara más de una vez por esas filas. Yo sé que para el PSOE la suma en este caso han de ser 15 y pare el PP 10.

egostar 31-03-2023 20:43:41

Hola

Falta la tabla mesas para poder ejecutar tu query.

Saludos

Angel.Matilla 01-04-2023 10:57:12

1 Archivos Adjunto(s)
Cita:

Empezado por egostar (Mensaje 550937)
Hola

Falta la tabla mesas para poder ejecutar tu query.

Saludos

Y también falta la tabla poblaciones. En el fichero adjunto al mensaje hay un script para crear y cargar las tablas. Los parámetros del query son estos:
  • PrvIns = "13"
  • Proceso = 40
  • Cpostal = "13"


La franja horaria es GMT +2. Ahora son las 09:10:53.

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