Ver Mensaje Individual
  #6  
Antiguo 19-10-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Reputación: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
1ra Pregunta - Por que se triplica el primer registro.

Seguramente porque el JOIN que utilizas lo triplica
Por ejemplo si hubiera 1 "Partidos" con 3 "NumElectos" que cumplan la condición del join.
También puede ser porque hay 1 "Partidos" con 3 "Resultados" que cumplen la condición B.Partido = C.Partido.

Para debugar este problema debes hacer un SELECT * y ver qué columnas son las diferentes.
Por ejemplo:
Código SQL [-]
SELECT *
  FROM Partidos A, Resultados B
  LEFT JOIN NumElectos C ON B.CodPrv = C.CodPrv AND B.Proceso = C.Proceso AND C.Tipo = 'M' AND C.Circunscripcion = 1217 AND B.Partido = C.Partido
 WHERE 
   A.CodPrv = '13' AND A.Codigo > 0
   AND B.Proceso = 42 AND A.CodPrv = B.CodPrv AND B.Partido = A.Codigo
   AND B.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = 1217)
 ORDER BY /*Votos DESC,*/ Electos DESC, Nombre
Te saldrán todas las columnas de cada tabla. Serán todas iguales excepto las de la tabla que se repite.
Solución: deberás corregir...


2da Pregunta: El orden es incorrecto.

Veo que hay campos para los que no utilizas ALIAS. Si se repiten en varias tablas puede estar ordenando por el que no quieres.
Corrige el ORDER BY
Para el campo Electos debes utilizar la función COALESCE porque de lo contrario los nulos estarán al principio (o al final, no recuerod).
Entiendo que nombre es de la tabla "Partidos". Puede que haya otro campo Nombre en otra de las tablas.
Votos no se decirte, porque es una función. Yo utilizaría la función completa con el CAST a integer para evitar que lo ordene como string ('1', '10', '11', ..., '2', '20', ...)
Código SQL [-]
 ORDER BY CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR') AS INTEGER) DESC, COALESCE(C.Electos, 0) DESC, A.Nombre


3ra Pregunta: No sale nada si agregas la condición al WHERE.

Lo más sencillo es agregarlo como dato para comprobar que lo que sale es lo que supones que debe salir... podría haber nulos o los CAST están convirtiéndo cosas raras, etc.
Veo que se trata de enteros, por lo que quizás el CAST deba ser a INTEGER.

Código SQL [-]
SELECT DISTINCT A.Codigo, A.Nombre, CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR') AS INTEGER) Votos, 
       COALESCE(C.Electos, 0) Electos, CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT') AS INTEGER) Total,
       RDB$SET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR', (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv 
                       AND Proceso = B.Proceso 
                       AND Partido = A.Codigo
                       AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = 1217))),
       RDB$SET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT', (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv 
                       AND Proceso = B.Proceso 
                       AND (Partido > 0 OR Partido = (SELECT Codigo FROM Partidos WHERE CodPrv = A.CodPrv AND Sigla = 'BLANCOS'))
                       AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = 1217))),
       -- Campos como Float
       CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR') AS DOUBLE PRECISION),  CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT') AS DOUBLE PRECISION), 
       -- Campos como Enteros
       CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR') AS INTEGER),  CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT') AS INTEGER),
       -- Resultado la la formula utilizada
       (5 * CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT') AS DOUBLE PRECISION) / 100)
  FROM Partidos A, Resultados B
  LEFT JOIN NumElectos C ON B.CodPrv = C.CodPrv AND B.Proceso = C.Proceso AND C.Tipo = 'M' AND C.Circunscripcion = 1217 
            AND B.Partido = C.Partido
 WHERE A.CodPrv = '13' AND A.Codigo > 0
   AND B.Proceso = 42 AND A.CodPrv = B.CodPrv AND B.Partido = A.Codigo
   AND B.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv AND Municipio = 1217)
   -- AND CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSPAR') AS DOUBLE PRECISION) >= 5 * CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'VOTOSTOT') AS DOUBLE PRECISION) / 100
 ORDER BY Votos DESC, Electos DESC, Nombre
Responder Con Cita