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 15-01-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Como te habia mencionado antes, hacer pivot en sql (si usa un motor sin cláusula pivot) NO SE PUEDE HACER DE FORMA DIRECTA. No hay manera de hacerlo con joins ni nada parecido.

Toca, semi-manualmente, transponer filas a columnas, que se hace con cláusulas CASE.

Mira los pasos:

https://mode.com/sql-tutorial/sql-pivot-table/
__________________
El malabarista.
Responder Con Cita
  #2  
Antiguo 15-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por vuestras respuestas. Estuve dando vueltas a vuestras sugerencias hasta que recordé que en otro punto del proyecto estoy usando este método y casi, casi lo logro. He dejado el query así:
Código SQL [-]
WITH Pivote AS (SELECT * FROM SYSDBA134147)
SELECT DISTINCT A.Nombre, C.Votos2 VotosC, D.Votos2 VotosD, E.Votos2 VotosE, F.Votos2 VotosF
FROM Proceso A, SYSDBA134147 B
LEFT JOIN Pivote C ON B.Codigo = C.Codigo AND C.Codigo = 25
LEFT JOIN Pivote D ON B.Codigo = D.Codigo AND D.Codigo = 29
LEFT JOIN Pivote E ON B.Codigo = E.Codigo AND E.Codigo = 33
LEFT JOIN Pivote F ON B.Codigo = F.Codigo AND F.Codigo = 40
WHERE A.Codigo = B.Proceso
ORDER BY B.Proceso, B.Codigo

Evidentemente estoy probando y faltan líneas en ese query. De todas formas, esta es la salida que obtengo:


Sólo me falta que todas las celdas de cada tipo estén en una sola línea.
Responder Con Cita
  #3  
Antiguo 15-01-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Recalco:

Cita:
Empezado por mamcx Ver Mensaje
No hay manera de hacerlo con joins ni nada parecido.
P.D: Esta es una limitación de la imperfecta implementación del sql del modelo relacional, pero no hay como arreglarla sin los pasos manuales requeridos...
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 15-01-2020
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
prueba con esto:

Código SQL [-]
WITH Pivote AS (SELECT * FROM SYSDBA134147)
SELECT A.Nombre, MAX(C.Votos2) VotosC, MAX(D.Votos2) VotosD, MAX(E.Votos2) VotosE, MAX(F.Votos2) VotosF
FROM Proceso A, SYSDBA134147 B
LEFT JOIN Pivote C ON B.Codigo = C.Codigo AND C.Codigo = 25
LEFT JOIN Pivote D ON B.Codigo = D.Codigo AND D.Codigo = 29
LEFT JOIN Pivote E ON B.Codigo = E.Codigo AND E.Codigo = 33
LEFT JOIN Pivote F ON B.Codigo = F.Codigo AND F.Codigo = 40
WHERE A.Codigo = B.Proceso
GROUP BY A.Nombre


A ver si te sale...

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 16-01-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
JOIN no es la solucion. los join crecen las filas, que es lo que menos se quiere aqui. Necesitan son aggregates (SUMs, GROUP By, ...).
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 16-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Thumbs up

Cita:
Empezado por fjcg02 Ver Mensaje
prueba con esto:

Código SQL [-]
WITH Pivote AS (SELECT * FROM SYSDBA134147)
SELECT A.Nombre, MAX(C.Votos2) VotosC, MAX(D.Votos2) VotosD, MAX(E.Votos2) VotosE, MAX(F.Votos2) VotosF
...


A ver si te sale...

Saludos
En principio parece que sí. Gracias. A ver si me entero de una vez bien como demonios funciona esto del pivote,

Cita:
Empezado por mamcx Ver Mensaje
JOIN no es la solucion. los join crecen las filas, que es lo que menos se quiere aqui. Necesitan son aggregates (SUMs, GROUP By, ...).
Efectivamente, necesito reducir el número de líneas.
Responder Con Cita
  #7  
Antiguo 16-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Thumbs up

Vale. Después de unas cuantas pruebas el query me queda así:
Código SQL [-]
WITH Pivote AS (SELECT * FROM SYSDBA134147)
SELECT DISTINCT A.Nombre,
                MAX(C.Votos2) VotosC, MAX(D.Votos2) VotosD, MAX(E.Votos2) VotosE, MAX(F.Votos2) VotosF
FROM Proceso A, SYSDBA134147 B
LEFT JOIN Pivote C ON B.Codigo = C.Codigo AND C.Codigo IN (25,26,35,24)
LEFT JOIN Pivote D ON B.Codigo = D.Codigo AND D.Codigo IN (29,30,36,28)
LEFT JOIN Pivote E ON B.Codigo = E.Codigo AND E.Codigo IN (33,34,37,32)
LEFT JOIN Pivote F ON B.Codigo = F.Codigo AND F.Codigo IN (40,38,42,39)
WHERE A.Codigo = B.Proceso
GROUP BY 1
y la salida es esta, que es lo que buscaba:

Tal vez se pueda hacer mejor, pero no se me ocurre como. Muchas gracias a todos por la ayuda.
Responder Con Cita
  #8  
Antiguo 16-01-2020
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Creo que lo lias mucho...

Saca los datos en filas.
Nombre, Codigo, Total

Luego agrupas:
Campos de agrupacion
+
Casos
FROM
( CONSULTA)
GROUP BY Campos de Agrupacion

En tu caso:

SELECT
DATOS.NOMBRE <- Campos para agrupar por filas, pueden ser varios
SUM( CASE WHEN DATOS.CODIGO IN (1,2,3) THEN VOTOS ELSE 0 END ) as COLUMNA1,
SUM( CASE WHEN DATOS.CODIGO IN (4,5,6) THEN VOTOS ELSE 0 END ) as COLUMNA2,
ETC...
FROM
<- AQUI LA QUERY CON LOS DATOS EN FILAS. El resultado tiene alias DATOS, y devolvera las columnas NOMBRE, CODIGO y VOTOS o las que quieras... La query entre paréntesis
(
SELECT
A.Nombre, V.Codigo, V.Votos
FROM SYSDBA134147 V
INNER JOIN PROCESO A ON ( A.Campo1=V.Campo1) <- Desconozco tu modelo...
<- Aqui puede ir la where que limite los datos
) DATOS
<- FIN DE LA QUERY
Aqui puede ir una where sobre el reslutado DATOS
--AGRUPAS
GROUP BY
DATOS.NOMBRE


Y a probar...

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 17-01-2020
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por la respuesta. He estado probando pero o no he montado bien el query o no sale lo que me hace falta. He dejado así el query:
Código SQL [-]
SELECT Datos.Nombre,
       CASE WHEN Datos.Codigo IN (39, 32, 28, 24) THEN Votos2 ELSE 0 END Columna1,
       CASE WHEN Datos.Codigo IN (42, 37, 36, 35) THEN Votos2 ELSE 0 END Columna2,
       CASE WHEN Datos.Codigo IN (38, 34, 30, 26) THEN Votos2 ELSE 0 END Columna3,
       CASE WHEN Datos.Codigo IN (40, 33, 29, 25) THEN Votos2 ELSE 0 END Columna4
  FROM (SELECT A.Nombre, B.Codigo, B.Votos2
          FROM SYSDBA194521 B
          LEFT JOIN Proceso A ON A.Codigo = B.Proceso) Datos
Lo que necesito son los datos de cada uno de los casos y por ello no me hace falta el SUM; es irrelevante. Pero al ejecutar este query las salida es esta:

Así no me vale porque el resultado del query lo necesito para definir un TQRChart. Me hace falta que los resultados de cada tipo queden en una misma fila.

No obstante es una idea interesante que no se me había ocurrido.

Última edición por Angel.Matilla fecha: 17-01-2020 a las 10:35:59.
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
Query con pivote Angel.Matilla Firebird e Interbase 2 02-01-2020 15:58:44
Termino Involucion ¿? amerika111 Varios 14 12-04-2012 01:08:43
SearchRec sale antes del termino Paulao Varios 3 19-07-2011 14:04:36
Detectar término sessión lucasarts_18 HTML, Javascript y otros 13 14-04-2008 17:43:05
Terminó de cargar la página? Novás Varios 2 08-07-2006 16:24:35


La franja horaria es GMT +2. Ahora son las 02:14:43.


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