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)
-   -   Filas a Columnas (https://www.clubdelphi.com/foros/showthread.php?t=73195)

amerika111 07-04-2011 03:11:32

Filas a Columnas
 
Hola que tal tengo una situacion me gustaria saber como hacer para que me aparescan las filas a columnas.

por que tengo el siguiente resultado con un select e inner join que utilizo



CONCEPTOS IDEMPLEADO CANTIDADES
123 4524 120
345 4524 45
456 4524 10
785 4524 45


y e leido algo de pivot pero no lo reconoce el firebird

fjcg02 07-04-2011 08:42:22

Todo tuyo...

http://www.clubdelphi.com/foros/show...ghlight=fjcg02

Saludos

oscarac 07-04-2011 17:45:57

pero.. y que columnas quieres?
que codigo tiene tu consulta...
un poco mas de detalle por favor

amerika111 07-04-2011 18:51:41

Código SQL [-]
select * FROM CONCEPTOS_NO INNER JOIN PAGOS_NOMINA_DET
on PAGOS_NOMINA_DET.CONCEPTO_NO_ID = CONCEPTOS_NO.CONCEPTO_NO_ID INNER JOIN EMPLEADOS
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA_DET.EMPLEADO_ID INNER JOIN PAGOS_NOMINA
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA.EMPLEADO_ID    where PAGOS_NOMINA.NOMINA_ID=83858


y esto despliega asi en general

Conceptos Monto Epleados
x1_________ 8.50___ 555
x2_________ 5.50___ 555
x3_________ 6.50___ 555
x4_________ 2.50___ 555
x1_________ 8.50___ 666
x2_________ 5.50___ 666
x3_________ 6.50___ 666
x4_________ 2.50___ 666

y quisiera que se agrupara por empleado pero no logro hacerlo y que los conceptos aparescan como columnas

Empleados x1 x2 x3 x4
555________ 8.50__5.50_6.50_2.50
666________ 8.50__5.50_6.50_2.50

oscarac 07-04-2011 19:13:23

Puedes hacer algo asi como esto (usare campos imaginarios)

Código Delphi [-]
 
Select Id_empleado, 
Case when Campo = 'x1', campoimporte else 0 end as x1,
Case when Campo = 'x2', campoimporte else 0 end as x2,
Case when Campo = 'x3', campoimporte else 0 end as x3,
Case when Campo = 'x4', campoimporte else 0 end as x4
from ....

el problema con esta consulta es que debes conocer de antemano cada uno de los conceptos (campo)

amerika111 07-04-2011 20:20:14

Cita:

Empezado por oscarac (Mensaje 396184)
Puedes hacer algo asi como esto (usare campos imaginarios)


Código Delphi [-]
Select Id_empleado,
Case when Campo = 'x1', campoimporte else 0 end as x1,
Case when Campo = 'x2', campoimporte else 0 end as x2,
Case when Campo = 'x3', campoimporte else 0 end as x3,
Case when Campo = 'x4', campoimporte else 0 end as x4
from ....





el problema con esta consulta es que debes conocer de antemano cada uno de los conceptos (campo)


y esto como lo podria integrar a el query que muestro arriba,, lo ingresaria des pues del where o despues de los inner join...

Gallosuarez 07-04-2011 20:22:33

Posible solución ...
 
amerika111:

Ese problema lo solucionas con CTE (Common Table Expressions), que es el equivalente al uso de PIVOT para otras bases de datos.

Aque viene un ejemplo de su uso:
http://www.firebirdsql.org/refdocs/l...d21-select-cte

Saludos,
Gerardo Suárez Trejo

fjcg02 07-04-2011 22:16:37

Cita:

Empezado por fjcg02 (Mensaje 396129)

Me reitero como la sidra el gaitero.

He ahí la solución. Aunque no entiendas ni un carajo, si entiendes cómo se hace la llamada, ya tienes lo que quieres. La procedure te devuelve la query montada, que será la que tienes que ejecutar.

Saludos

amerika111 07-04-2011 22:23:40

Cita:

Empezado por fjcg02 (Mensaje 396212)
Me reitero como la sidra el gaitero.

He ahí la solución. Aunque no entiendas ni un carajo, si entiendes cómo se hace la llamada, ya tienes lo que quieres. La procedure te devuelve la query montada, que será la que tienes que ejecutar.

Saludos


si ya cheque tu procedimiento pero es que no necesito sumar nada toda la info ya la tengo en tablas nadas mas que nose como acomodarla por empleado... ahorita el empleado se repite tantas veces tenga conceptos de pago si tiene 8 conceptos me aparece 8 veces por que los conceptos me aparecen en filas y no en columnas

oscarac 07-04-2011 22:37:59

mmm si pudieras exportar tus tablas a un... no se access quiza y poder mandarlar para ver que se puede hacer

fjcg02 07-04-2011 22:40:30

Pongamos luz en el asunto...

Espero que tengas algo de destreza.

Ejecuta la sentencia para que te cree la procedure CREARPIVOTE

Una vez tengas creado el procedimiento, llama al mismo con estos parámetros ( ten en cuenta que estoy suponiendo algunas cosas )


CREARPIVOTE ( 'TUTABLA','IDEMPLEADO','CONCEPTOS','MONTO','CONDICIONES')

TUTABLA será la tabla + las inner joins de todas las tablas que intervienen
IDEMPLEADO es el campo por el que quieres agrupar las filas
CONCEPTOS es el campo que quieres que pase de filas a columnas. No debiera haber demasiados conceptos en la tabla.
MONTO es el campo que quieres sumar por cada CONCEPTO ( El procedimiento sólo suma )
CONDICIONES filtro que aplica si procede Fecha desde hasta, ...

el resultado es una cadena con la query generada. Será algo del tipo...

Código SQL [-]
Select IDEMPLEADO,
sum(Case when Campo = 'x1', MONTO else 0 end as x1,
sum(Case when Campo = 'x2', MONTO else 0 end as x2,
sum(Case when Campo = 'x3', MONTO else 0 end as x3,
sum(Case when Campo = 'x4', MONTO else 0 end as x4,
...
from TUTABLA
WHERE CONDICIONES

...que es lo que propone oscarac, lo que pasa es que es automático, y no debes saber el nº de columnas de antemano.

Luego copias esa select y la ejecutas en el ibexpert o en editor que utilices.

Ya nos dirás.

Saludos

oscarac 07-04-2011 22:47:53

se ve interesante
pero... debe existir alguna otra forma...
aunque si amerika111 no tiene problemas podria llamar a ese procedimiento y como dices tu armar la cadena y listo:rolleyes:

fjcg02 07-04-2011 23:00:45

Cita:

Empezado por oscarac (Mensaje 396222)
se ve interesante
pero... debe existir alguna otra forma...
aunque si amerika111 no tiene problemas podria llamar a ese procedimiento y como dices tu armar la cadena y listo:rolleyes:

Sí, creo que podría hacerlo. Si os fijais, es muy sencillo añadir un parámetro más para permitir hacer sumas, medias, minimos o máximos.

Se ve interesante el tema del WITH [RECURSIVE] pero a estas horas no tengo el cuerpo para jotas. Además, es para FB 2.1 o superior, por lo que no sirve para todas las versiones.

Saludos

amerika111 07-04-2011 23:17:04

pues trate de hacerlo asi pero nop no error tras error....

WITH EMPLEADO_ID AS (
SELECT NOMBRE_COMPLETO,PUESTO_NO_ID,DEPTO_NO_ID,SALARIO_DIARIO
FROM EMPLEADOS
GROUP BY EMPLEADOS.EMPLEADO_ID
)
SELECT DISTINCT DIAS_TRAB,HORAS_TRAB,HORAS_EXT,FORMA_PAGO
FROM PAGOS_NOMINA
LEFT JOIN EMPLEADOS
ON PAGOS_NOMINA.EMPLEADO_ID = EMPLEADOS.EMPLEADO_ID
LEFT JOIN PAGOS_NOMINA_DET
ON CONCEPTOS_NO.CONCEPTO_NO_ID=PAGOS_NOMINA_DET.CONCEPTO_NO_ID ;




subo el diagrama que mas o menos lo tengo asi... para saber si se puede realizar, con este codigo me despliega todos los conceptos del empleado en forma de filas si cuenta con 8 conceptos repite al empleado 8 veces por que cada concepto viene con empleadoid, entonces por eso queria ver la forma de pasar los conceptos a columnas y que empleados aparecienran en filas.

SELECT * FROM CONCEPTOS_NO INNER JOIN PAGOS_NOMINA_DET
on PAGOS_NOMINA_DET.CONCEPTO_NO_ID = CONCEPTOS_NO.CONCEPTO_NO_ID INNER JOIN EMPLEADOS
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA_DET.EMPLEADO_ID INNER JOIN PAGOS_NOMINA
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA.EMPLEADO_ID where PAGOS_NOMINA.NOMINA_ID=83858

oscarac 07-04-2011 23:55:35

mmmm que base de datos Usas?
quiza sea absurda la pregunta pero quiero estar seguro

amerika111 07-04-2011 23:56:46

Cita:

Empezado por oscarac (Mensaje 396230)
mmmm que base de datos Usas?
quiza sea absurda la pregunta pero quiero estar seguro

Microsip con firebird

Gallosuarez 08-04-2011 02:41:25

Sugerencia ...
 
amerika111:

Lo sorprendente sería que dijeras que ese código te hubiera funcionado. Mira, no creo que estés entendiendo el concepto de CTE's (veo que, además de estar pésimamente implementado, el concepto no se está entendiendo).

Por otro lado, en este mismo foro ya se había tratado este tema con anterioridad. El compañero fjcg02 mencionó entonces en aquella ocasión que utilizar CTE's no resolvía el problema si existían varios conceptos. Lo cual no es un problema, puesto que se resuelve utilizando bloques ejecutables (Execute Block). Que es mas o menos lo que él hace en dicho procedimiento almacenado, con la diferencia que el código resultante es sumamente robusto y eficiente (amen de ser una solución elegante). Otra cosa, el código completo se puede armar desde la misma aplicación (ventaja de hacerlo con Execute block).

Bueno, hecha esta aclaración le digo a amerika111 que primero tiene que entender bien el concepto. Resolver su problema no debe de llevarse mucho tiempo.

Saludos,
Gerardo Suárez Trejo
PD. Estoy creando tutoriales que tratan todas estas cuestiones ... espero pronto subirlos para haber si les puede ser útiles a alguien... saludos nuevamente ...

fjcg02 08-04-2011 08:24:12

bbbbbbbbbbbbbbbbbbbbbbbbbb

fjcg02 08-04-2011 09:24:17

Cita:

Empezado por fjcg02 (Mensaje 396260)
bbbbbbbbbbbbbbbbbbbbbbbbbb

Llevo un rato intentando entender el WITH este del demonio, y no acabo de cogerle el punto ... :confused::confused:

guillotmarc 08-04-2011 09:49:25

En mi opinión os estáis complicando mucho. Solucionarlo con subconsultas normalmente es bastante sencillo (claro que solo se puede hacer cuando el nº de columnas está prefijado de antemano).

Sería algo del tipo :

Código SQL [-]
select mes
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'A') as ventas_A,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'B') as ventas_B,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'C') as ventas_C
from meses

Saludos.


La franja horaria es GMT +2. Ahora son las 21:24:56.

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