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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Query con pivote

Tengo una BB.DD. en Firebird 2.5 y necesito montar un query con un pivote pero me está dando resultados qe no acabo de entender. A ver si soy capaz de explicarlo.

El query usa estas tablas:
1. Elecciones
Codigo Proceso Fecha
1 6 1979
2 4 1982
3 5 1983... etc.

2. Proceso
Codigo Nombre
3 EUROPEAS
4 GENERALES
5 AUTONOMICAS
6 MUNICIPALES

3. Resultados
Proceso Mesa Partido Votos
29 139 3 131
29 139 14 43
29 139 2 144... etc.

4. Mesas
Codigo Municpio Distrito Seccion Mesa
1 175 1 1 U
2 175 1 2 U... etc.

5. Partidos
Codigo Nombre Sigla
2 PARTIDO POPULAR PP
3 PARTIDO SOCIALISTA PSOE... etc.

Y el query (se crea de forma dinámica en función de la selección del usuario) lo tengo montado así:
Código SQL [-]
WITH Pivote AS (SELECT * FROM Resultados)
SELECT A.Codigo, A.Fecha, B.Nombre, CS.Partido, PP.Partido, SUM(CS.Votos) VotosCS, SUM(PP.Votos) VotosPP
  FROM Elecciones A, Proceso B, Resultados C
INNER JOIN Pivote CS ON A.CodPrv = CS.CodPrv AND A.Codigo = CS.Proceso AND CS.Partido = 22 AND C.Partido = CS.Partido AND C.Mesa = CS.Mesa
INNER JOIN Pivote PP ON A.CodPrv = PP.CodPrv AND A.Codigo = PP.Proceso AND PP.Partido =  2 AND C.Partido = PP.Partido AND C.Mesa = PP.Mesa
 WHERE A.Codigo IN (39, 32, 28, 24, 42, 37, 36, 35, 38, 34, 30, 26, 40, 33, 29, 25)
   AND A.Proceso = B.Codigo
   AND A.Codigo = C.Proceso AND C.Mesa IN (SELECT Codigo FROM Mesas WHERE Municipio = 1217)
 GROUP BY A.Codigo, A.Fecha, B.Nombre, CS.Partido, PP.Partido
 ORDER BY Nombre, Fecha
EL problema me viene porque si pongo sólo un INNER JOIN sí me da resultados; por ejemplo dejando el primer INNER JOIN:

Pero en el momento que añado más JOIN no me genera ningún resultado. He probado con LEFT en vez de INNER y si saca todas las filas que me interesan y muchas que no:

Por más vueltas que he dado no se me ocurre como hacerlo.
Responder Con Cita
  #2  
Antiguo 02-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Además me he dado cuenta que con LEFT JOIN no me saca un línea por cada proceso, que es lo que estoy buscando, y saca un línea por partido:
Responder Con Cita
  #3  
Antiguo 02-01-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.927
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
La razon basica es que los JOINS filtran FILAS. Los pivot en cambian trabajan de forma columnar y con agregaciones.

Hay unas mejoras en el SQL mas moderno que no veo en firebird que lo hacen un poco mas complicado, pero en fin la idea es:

1- Genera todas las filas requeridas LUEGO
2- Usa agregados y/o pivotea los datos

Dependiendo de la complejidad de esos agregados puede resultar mas simple crear una tabla temporal y hacer insert/updates.

Tambien da resultado partir la consulta en secciones. Primero haces los joins que cojen un conjunto de datos y luego los mezclas. Asi es MAS sencillo ver en que momento la consulta se "tuerce" y enfocarse en resolver eso.

P.D: Si la cosa no te da, podrias crear un script con una seccion limitada de datos pa checar...
__________________
El malabarista.
Responder Con Cita
Respuesta



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
Realizar un Update en delphi con un query concondicion desde otro query!!! rotsen26 SQL 9 09-03-2013 23:17:47
Query dentro de otro query (Access) FGarcia SQL 2 28-12-2007 06:46:05
Hacer un Query de otro Query francisco260184 SQL 9 10-04-2007 04:46:18
Como hacer referencia a un query dentro de otro query? JuanBCT SQL 2 05-09-2006 19:35:25
query dentro de query jonmendi SQL 3 29-07-2005 16:13:33


La franja horaria es GMT +2. Ahora son las 02:37:07.


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