Ver Mensaje Individual
  #14  
Antiguo 13-11-2023
Avatar de duilioisola
[duilioisola] duilioisola is online now
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
He estado mirando las tablas...

Primera parte
La primera duda es cómo se unen mesa, poblacion y numelectos.
He inferido que mesas.codigo, poblacion.municipio y numelectos.circunscripcion es el mismo campo y lo he utilizado para los joins.

La segunda duda es qué es proceso? He inferido que se trata de diferentes votaciones y he estado utilizando la número 42.

Segunda parte.
Lo primero que necesitas antes de hacer las acumulaciones es la tabla con todos los datos necesarios unidos mediante JOIN / LEFT JOIN.
  • Parto de PARTIDOS y le uno los RESULTADOS.
  • Los RESULTADOS son de MESAS. Por lo tanto se unen a RESULTADOS.
  • Las MESAS pertenecen a POBLACIONES, que se unen por el campo MUNICIPIO.
  • Finalmente, NUMELECTOS se une mediante LEFT JOIN porque no necesariamente tiene electos para cada PROCESO-PROVINCIA-PARTIDO-MUNICIPIO
Esto me deja el siguiente SQL con alias identificados con la primera letra del nomrbre de la tabla. (excepto POBLACION po).
Este SQL devuelve 113511 registros.
Todos con valores excepto los que pertenecen a la tabla NUMELECTOS que a veces son nulos.
Código SQL [-]
select *
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion

Ahora agrego el where para limitar los datos a tratar.
En este caso he elegido alguno que devuelve datos y que hemos hablado en este hilo
Este SQL devuelve 8 registros.
Todos con valores excepto los que pertenecen a la tabla NUMELECTOS que a veces son nulos.
Código SQL [-]
where
p.codprv = 13 and
r.proceso = 42 and
m.municipio = 175

Final
Ya tenemos los datos. Ahora solo tenemos que agruparlos y ordenarlos.

Código SQL [-]
select p.codigo, p.nombre, coalesce(sum(r.votos), 0) votos, coalesce(n.electos, 0) electos, n.circunscripcion,
       po.nombre
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion
where
p.codprv = 13 and
r.proceso = 42 and
m.municipio = 175
group by p.codigo, p.nombre, electos, n.circunscripcion, po.nombre
order by po.nombre, 3 /*votos*/ desc, 4 /*electos*/ desc, p.nombre

Dos formas de evitar que salgan registros "sin electos".
Código SQL [-]
select p.codigo, p.nombre, coalesce(sum(r.votos), 0) votos, coalesce(n.electos, 0) electos, n.circunscripcion,
       po.nombre
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion
where
p.codprv = 13 and
r.proceso = 42 and
m.municipio = 175
/* Para evitar registros sin electos */
and n.circunscripcion is not null
group by p.codigo, p.nombre, electos, n.circunscripcion, po.nombre
order by po.nombre, 3 /*votos*/ desc, 4 /*electos*/ desc, p.nombre

Código SQL [-]
select p.codigo, p.nombre, coalesce(sum(r.votos), 0) votos, coalesce(n.electos, 0) electos, n.circunscripcion,
       po.nombre
from partidos p
join resultados r on r.partido = p.codigo and p.codprv = r.codprv
join mesas m on m.codprv = r.codprv and m.codigo = r.mesa
join poblacion po on p.codprv = po.codprv and m.municipio = po.codigo
left join numelectos n on r.codprv = n.codprv and r.proceso = n.proceso and n.tipo = 'M' and r.partido = n.partido and po.codigo = n.circunscripcion
where
p.codprv = 13 and
r.proceso = 42 and
m.municipio = 175
group by p.codigo, p.nombre, electos, n.circunscripcion, po.nombre
/* Para evitar registros sin electos */
having coalesce(n.electos, 0) > 0
order by po.nombre, 3 /*votos*/ desc, 4 /*electos*/ desc, p.nombre
Responder Con Cita