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)
-   -   Select List (https://www.clubdelphi.com/foros/showthread.php?t=94717)

Angel.Matilla 08-06-2020 11:26:32

Select List
 
En una base de datos en Firebird, ¿se puede hacer un SELECT LIST sobre una suma?
Código SQL [-]
SELECT LIST(SUM(A.Total))...
si se puede, ¿cómo?

Casimiro Notevi 08-06-2020 11:36:49

Pero sum() devuelve un solo valor, no puede ser una lista.

Angel.Matilla 08-06-2020 12:59:21

¡Qué vergüenza! Ahora me he dado cuenta de que he hecho mal la pregunta. Efectivamente mi pregunta anterior es completamente absurda.

Casimiro Notevi 08-06-2020 13:11:28

Cualquiera se equivoca, no hay vergüenza. Hasta yo mismo puedo equivocarme alguna vez :p:p:p

Angel.Matilla 08-06-2020 13:29:00

Gracias. A ver si ahora me explico mejor.

Tengo este query:
Código SQL [-]
SELECT SUM(A.Votos), C.Sigla, D.Electos, CASE WHEN C.Codigo < 0 THEN C.Codigo ELSE 1 END, B.Municipio
  FROM Resultados A, Mesas B, Partidos C, NumElectos D 
 WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
   AND A.Proceso = (SELECT MAX(Codigo) FROM Elecciones WHERE CodPrv = A.CodPrv
                       AND Proceso = (SELECT Codigo FROM Proceso WHERE CodPrv = A.CodPrv AND Nombre = 'MUNICIPALES') AND Cerrado = 1) 
   AND A.CodPrv = B.CodPrv AND A.Mesa = B.Codigo
   AND A.CodPrv = C.CodPrv AND A.Partido = C.Codigo 
   AND A.CodPrv = D.CodPrv AND D.Tipo = 'J' AND B.Municipio = D.Circunscripcion AND A.Partido = D.Partido 
 GROUP BY 2, 3, 4, 5
 ORDER BY 5, 4 DESC, 3 DESC, 1 DESC
que genera una salida como esta

y me haría falta que la salida fuera más o menos así:
Cita:

PP 611 6,PSOE 472 3, 175
PP 376 5,PSOE 398 3, OTROS 356 1, 686
etc.
siendo el primer trozo la sigla, el segundo los votos y el tercero los electos. Y no se me ocurre cómo porque si pongo
Código SQL [-]
SELECT LIST(C.Sigla||' '||SUM(A.Votos)||' ' ||B.Municipio)...
me da este error:
Código:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Nested aggregate functions are not allowed.

Que entiendo indica que no se puede meter una función de este tipo (SUM, COUNT, etc.) dentro de un LIST.

cloayza 08-06-2020 17:14:33

Bueno, tendría que ser así mas o menos...

Código SQL [-]
SELECT LIST(Sigla||' '||Suma||Electos,',')
FROM 
    (SELECT SUM(A.Votos) as Suma, C.Sigla, D.Electos, CASE WHEN C.Codigo < 0 THEN C.Codigo ELSE 1 END, B.Municipio
     FROM Resultados A, Mesas B, Partidos C, NumElectos D 
     WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
   AND A.Proceso = (SELECT MAX(Codigo) FROM Elecciones WHERE CodPrv = A.CodPrv
                       AND Proceso = (SELECT Codigo FROM Proceso WHERE CodPrv = A.CodPrv AND Nombre = 'MUNICIPALES') AND Cerrado = 1) 
   AND A.CodPrv = B.CodPrv AND A.Mesa = B.Codigo
   AND A.CodPrv = C.CodPrv AND A.Partido = C.Codigo 
   AND A.CodPrv = D.CodPrv AND D.Tipo = 'J' AND B.Municipio = D.Circunscripcion AND A.Partido = D.Partido 
 GROUP BY 2, 3, 4, 5
 ORDER BY 5, 4 DESC, 3 DESC, 1 DESC)

Saludos cordiales

Angel.Matilla 08-06-2020 20:56:05

Gracias por la idea. Mañana mismo lo probaré.

Angel.Matilla 09-06-2020 10:18:13

Cita:

Empezado por cloayza (Mensaje 537555)
Bueno, tendría que ser así mas o menos...

¡Perfecto! Es exactamente lo que me hacía falta. Ahora tengo que ver como lo encajo en el programa.

Angel.Matilla 09-06-2020 11:30:43

Vale. Ya he conseguido meterlo dentro de otro query bastante más bestia que me hace falta para generar un informe pero me surge otro problema y es que algunos de los parámetros están referidos a alguna de las columnas de ese query. Sé que esto es una burrada, pero no se me ocurre una forma mejor de hacerlo.
Código SQL [-]
SELECT A.Codigo, A.Municipio, A.Actualiza, A.Partido, A.Comarca, A.Padron, A.Concejales, A.Censo, 
       A.Relacion, A.Proceso, A.F_proceso, A.Nombre_alcalde, A.Partido_alcalde, A.Junta, A.Afiliados, 
       A.RatAfi, A.Constitucion, A.Sede, A.TlfSede, A.Presidente, A.Portavoz, A.LisCon, A.U_municipal,
       A.Observaciones, CASE WHEN A.CodPro = A.U_municipal THEN 1 ELSE 0 END Ultima, 
       SUM(B.Votos) Votos, LIST(H.Sigla||' '||H.Suma||' '||H.Electos)
  FROM Dl01 A, Resultados B, Mesas C,
       (SELECT SUM(D.Votos) Suma, F.Sigla, G.Electos, CASE WHEN F.Codigo < 0 THEN F.Codigo ELSE 1 END Orden
        FROM Resultados D, Mesas E, Partidos F, NumElectos G 
       WHERE D.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
         AND D.Proceso = :Proceso
         AND D.CodPrv = E.CodPrv AND D.Mesa = E.Codigo 
         AND E.Municipio = :Municipio
         AND D.CodPrv = F.CodPrv AND D.Partido = F.Codigo 
         AND D.CodPrv = G.CodPrv AND G.Tipo = 'J' AND G.Circunscripcion = E.Municipio 
         AND D.Partido = G.Partido 
       GROUP BY 2, 3, 4 
       ORDER BY 4 DESC, 3 DESC, 1 DESC) H
 WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') 
   AND A.CodPro = (SELECT MAX(Codigo) FROM Elecciones WHERE CodPrv = A.CodPrv) 
   AND A.Codigo IN (SELECT Municipio FROM Junta WHERE CodPrv = A.CodPrv AND Zona = 15) 
   AND B.CodPrv = A.CodPrv AND B.Proceso = A.CodPro AND C.CodPrv = A.CodPrv AND B.Mesa = C.Codigo 
   AND C.Municipio = A.Codigo 
 GROUP BY A.Codigo, A.Municipio, A.Actualiza, A.Partido, A.Comarca, A.Padron, A.Concejales, A.Censo, 
          A.Relacion, A.Proceso, A.F_proceso, A.Nombre_alcalde, A.Partido_alcalde, A.Junta, 
          A.Afiliados, A.RatAfi, A.Constitucion, A.Sede, A.TlfSede, A.Presidente, A.Portavoz, 
          A.LisCon, A.U_municipal, A.Observaciones, Ultima
 ORDER BY Municipio
¿Cómo puedo referenciar en el SELECT que hay dentro del FROM, el que me sugirió cloayza (en azul), que ese D.Proceso es el mismo valor que A.U_municipal y que E.Municipio vale lo mismo que A.Codigo?


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

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