Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 03-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 03-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
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í....
Responder Con Cita
  #4  
Antiguo 03-06-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 04-06-2007
Avatar de rruz
[rruz] rruz is offline
Miembro Premium
 
Registrado: jun 2006
Posts: 146
Poder: 18
rruz Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 05-06-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #7  
Antiguo 05-06-2007
Avatar de rruz
[rruz] rruz is offline
Miembro Premium
 
Registrado: jun 2006
Posts: 146
Poder: 18
rruz Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 05-06-2007
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
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 .

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

Hasta Luego .-
__________________
No todo es como parece ser...
Responder Con Cita
  #9  
Antiguo 08-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
Smile 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
Responder Con Cita
  #10  
Antiguo 08-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 09-06-2007
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
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.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -

Última edición por fjcg02 fecha: 09-06-2007 a las 00:22:22.
Responder Con Cita
  #12  
Antiguo 09-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 10-06-2007
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
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #14  
Antiguo 11-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
columnas dinámicas

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
Archivos Adjuntos
Tipo de Archivo: zip Copia de PAGADURIAS COOPCONFIANZA.zip (9,5 KB, 24 visitas)
Responder Con Cita
  #15  
Antiguo 12-06-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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
__________________
AKA "El animalito" ||Cordobés a mucha honra||
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
Duda con columnas en DBF NeWsP Tablas planas 11 25-07-2006 19:28:38
Columnas en QReport jdangosto Impresión 1 28-09-2004 16:57:53
Descripcion Columnas OmarPerez Firebird e Interbase 1 16-04-2004 19:50:13
columnas en rxrichedit mosorio Varios 0 14-04-2004 13:36:52
Dos columnas karlita_cb Tablas planas 1 26-03-2004 02:23:21


La franja horaria es GMT +2. Ahora son las 22:18:06.


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