Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Columnas dimámicas....??? (https://www.clubdelphi.com/foros/showthread.php?t=44315)

GustavoCruz 03-06-2007 18:35:44

Columnas dimámicas....???
 
Hola a todos

en este momento tengo una inquietud y me gustaría saber si es posible realizar tal cosa; la cuestión es la siguiente.
tengo una tabla con un campo tipo fecha. luego deseo generar una consulta que me arroje los datos no en filas sino en columnas, me hago a entender, supongase que la tabla tiene 10 registros con 5 meses distintos en un mismo año, la consulta a momento de vaciarla a un dbgrid me debe mostrar las 5 columnas correspondientes a cada mes.

de antemano gracias por todo el interés que se presente

Caral 03-06-2007 19:10:04

Hola
La verdad no entiendo muy bien el problema, el dbgrid va a presentar la informacion que se quiera, es cuestion de hacer una consulta sql con un query y darle el orden que se necesite en el dbgrid, no se, no entiendo cual es el problema.
Saludos

GustavoCruz 03-06-2007 19:54:00

columnas dinámicas
 
suponte que la consulta va a generar un campo tipo fecha eso normalmente

fecha
=======
01/05/2007
15/05/2007
01/01/2007
01/02/2007

lo que me gustaría es que mostrara los datos de esta manesra

enero febrero mayo
============================
01/01/2007 01/02/2007 01/05/2007
15/05/2007

creo que ahora sí....

marcoszorrilla 03-06-2007 23:09:31

Creo que lo que quieres podría hacerse con la instrucción SQL "Pivot", el problema es que no todos los motores tienen esa instrucción.

También es posible que puedas simularlo artificialmente, creando una nueva tabla al vuelo y colocando apropiadamente los valores obtenidos.

Un Saludo.

rruz 04-06-2007 10:47:00

Hola, que tal algo asi ?

(ej: en mysql)



Código SQL [-]
  Select campo1,campo2,campoN,
  if(month(fecha)=1,fecha,null)      as 'Enero',
  if(month(fecha)=2,fecha,null)      as 'Febrero',
  if(month(fecha)=3,fecha,null)      as 'Marzo',
..
..
..
if (month(fecha)=12,fecha,null) as 'Diciembre' 
from tabla
Para una respuesta mas optimizada o que se ajuste mejor a tus requerimientos necesitaria saber que motor SQL usas.

Saludos

AzidRain 05-06-2007 03:07:53

ese codigo no le va a servir porque si te fijas necesita que en cada fila aparezcan los datos de todos los meses. Saldria algo como:

Código:

ENERO -----febrero ----marzo
  01/01/07    null          null
    null      01/02/07    null
    null        null        01/03/07

y lo que el quiere es:
Código:

ENERO -----febrero ----marzo
  01/01/07    01/02/07  01/03/07

no veo como hacerlo sin usar al menos una tabla temporal o algun algoritmo para llenar la tabla final.

SQL Server y otros tienen una funcion transform y PIvot que en teoría puede hacer eso.

rruz 05-06-2007 03:13:35

Cita:

Empezado por AzidRain
ese codigo no le va a servir porque si te fijas necesita que en cada fila aparezcan los datos de todos los meses. Saldria algo como:

Código:

ENERO -----febrero ----marzo
  01/01/07    null          null
    null      01/02/07    null
    null        null        01/03/07

y lo que el quiere es:
Código:

ENERO -----febrero ----marzo
  01/01/07    01/02/07  01/03/07

no veo como hacerlo sin usar al menos una tabla temporal o algun algoritmo para llenar la tabla final.

SQL Server y otros tienen una funcion transform y PIvot que en teoría puede hacer eso.

AziRain

si ves lo que el plantea

enero febrero mayo
============================
01/01/2007 01/02/2007 01/05/2007
15/05/2007

lo que yo plantee devuelve

enero febrero mayo
============================
01/01/2007 01/02/2007 01/05/2007
15/05/2007 null null

o podria reemplazar el null por lo que el quiera.

Yo creo que si le sirve, porque no esperas que responda el interesado y de su veredicto y ves si sirve o no.

Por otra parte sin duda usar pivot le va a solucionar su problema, pero eso no lo sabremos (si lo puede utilizar o no) hasta conocer que motor SQL usa.


Saludos.

lucasarts_18 05-06-2007 05:10:44

Hola:

Este tema por lo menos lo resuelvo en php mediante arreglos, y en html voy jugando con los valores del arreglo, empero, es algo un poco complicado, lo cual ni siquiera a mí me satisface :mad:.

Por otro lado he escuchado que los cubos SQL resuelven este tipo de problemas :D, pero no sigo argumentando mas allá porque mis conocimientos no llegan a tal punto...:(

Hasta Luego .-

GustavoCruz 08-06-2007 19:20:47

columnas dinámicas...???
 
Es cierto lo que afirma AzidRain.
creo que tendré que lanzar una consulta para averiguar cuántos registros "Meses" se encuentran en la tabla inicial, luego se creará la table temporal con el número de meses resultantes que pueden ser 48, es decir una table que tendrá por lo menos 48 columnas y luego pasar de la tabla inicial a la tabla temporal. Esa es la solución que me he planteado por mucho tiempo y me imaginé que podría haber otra solución...

Gracias por tados su aportes y el interés que me prestaron; si hay algún otro aporte, con gusto lo atenderé.

GustavoCruz

Lepe 08-06-2007 20:59:45

Para evitar la creación de una tabla, podría usarse un Procedimiento almacenado (Store Procedure). Como no se comenta si es paradox, firebird, mySql, etc... pues mejor no digo nada y me quedo callado.

Saludos ;)

fjcg02 09-06-2007 00:18:31

Bueno chicos, discrepo un poco de lo dicho anteriormente.

ACotemos. A no ser que sea un caso excepcional, los humanos funcionamos por años. Esto quiere decir que los datos devueltos por la consulta serán máximo 32 filas ( titulo y dias del mes ) y 12 columnas ( meses del año).

Podemos no volvernos locos y utilizar una string-grid.

Si queremos hacer una consulta que devuelva todo a la primera y esperando no colarme, debo suponer que sólo puede haber un registro por día, sino no tendría sentido.
Y una vez dicho esto, podemos probar con lo siguiente

Código SQL [-]
SELECT 
max(case when funcionmes(fecha)=1 then fecha else null) as Enero,
max(case when funcionmes(fecha)=2 then fecha else null) as Febrero, 
max(case when funcionmes(fecha)=3 then fecha else null) as MArzo,
...
max(case when funcionmes(fecha)=12 then fecha else null) as Diciembre
FROM tabla
WHERE fecha BETWEN 1/1/Año and 31/12/año
GROUP BY funciondia( fecha )

Bueno, antes de enviar el mensaje he intentado probar en firebird y no hay 'pelotas' para encontrar las funciones mes y dia de una fecha.

En otros motores entiendo que no debiera haber ningún problema adecuandolos un poco.

Saludos a todos

A ver si alguine se anima y los puede probar en diferentes motores.

Delphius 09-06-2007 19:16:49

Puede que diga una tontería, ¿Pero no se podría lograr este efecto con los componentes de la paleta Decision Cube?

Digo... en una de esas... lanzar la consulta y que despues se pivoteen los resultados con los componentes.

Creería que para eso estan... para armar cubos de datos y pivotearlos.
Si dije algo demasiado tonto, disculpen. No he usado Los Decision Cube.

Saludos,

fjcg02 10-06-2007 22:38:29

No sé porqué el otro dia posteé la solución a lo que propuse y ha desaparecido

Este ejemplo muestra lo que decía

Código SQL [-]
SELECT
max(case when (substring(cast( dia as char(10)) from 6 for 2))='01' then dia else '1/1/1900' end) as Enero,
max(case when (substring(cast( dia as char(10)) from 6 for 2))='02' then dia else '1/1/1900' end) as Febrero,
max(case when (substring(cast( dia as char(10)) from 6 for 2))='03' then dia else '1/1/1900' end) as Abril,
max(case when (substring(cast( dia as char(10)) from 6 for 2))='04' then dia else '1/1/1900' end) as MAyo,
max(case when (substring(cast( dia as char(10)) from 6 for 2))='05' then dia else '0FALTA' end) as Junio,
max(case when (substring(cast( dia as char(10)) from 6 for 2))='12' then dia else '1/1/1900' end) as Diciembre

FROM calendario
WHERE (dia >= '01.01.2007' and dia <='31.12.2007') and dia <> '01.05.2007'
GROUP by substring(cast( dia as char(10)) from 9 for 10)
No se porqué - y ahora pregunto yo - no doy con las funciones dia y mes en firebird, lo que he hecho es hacer un cast de las fechas a texto y seleccionar el día y el mes según lo necesito.

Podría alguien poner un poco de luz en este asunto ? . Seguro que es una chorrada, pero no soy con ello.

Respecto a usar el cubo, no me ha dado buenos resultados.

Por cierto, si en la primera respuesta que doy voy acertado, no tiene mucho sentido utilizar una query para extraer estos datos, puede ser mucho más sencillo utilizar un string grid.

Saludos

GustavoCruz 11-06-2007 05:47:25

columnas dinámicas
 
1 Archivos Adjunto(s)
Les envío adjunto un reporte en excel, en el podran encontrar información que se toma de varias tablas, pero las que importan son las siguientes

Libranzas
=========
numero
Valor
Fechaelaboracion
fechainicio
fechafin
cuotas
cuotasrestantes
valcuotas
cliente
monto
intereses

Pagos
=========
ide
libranza
fechaacuerdo
fechapago
horapago
valpagado
cuotanumero

segun el número de cuotas que se especifican en la tabla libranzas se llena la tabla pagos, es decir, me aprueban una solicitud de crédito para pagar a 24 meses, entonces debo llenar la tabla pagos y luego al realizar los pagos debo actualizar dicha tabla.

asi que hay 20 solicitudes 10 a 24 meses 5 a12 meses y las restantes a 18 meses, se debe generar el reporte que adjunto, pues de él debo tomar la espectativa de recaudo, el recaudo, las personas que pagan en la fecha acordada, los que son moros, etc...

espero no ser cansón con este asunto... De antemano gracias por sus aportes.

GustavoCruz

AzidRain 12-06-2007 03:01:14

Con el decision cube se supone que se puede hacer esto facilmente, pero la verdad trae poca documentación y a mi me ha costado mucho encontrar algo digerible


La franja horaria es GMT +2. Ahora son las 17:26:37.

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