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 23-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
consulta en sql

Hola tengo un problema con una consulta que quiero hacer.
Tengo 1 tabla que contiene la sgte información

Oficina Ruta Ingreso
1 A 100
1 B 70
1 C 200
2 A 200
2 D 150
2 E 250
3 A 100
3 B 200

¿cómo puedo hacerle para obtener el sigte resultado?

rutas
oficina A B C D E
1 100 70 200
2 200 150 250
3 100 200

Es decir combinar de una misma tabla renglones y columnas.
donde cada oficina puede manejar hasta 500 rutas

Gracias de antemano
Responder Con Cita
  #2  
Antiguo 23-09-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
El tema de crear nuevos campos en el resultado de la consulta no creo que te funcione.

Deberías hacerlo a mano, recorriendo los resultados y montando la grid desligada de la base de datos.

Algo así como:

En un Query montas la sentencia select * from tabla order by oficina

Creas una grid con 1 columna y 2 filas.

La idea es ir buscando la ruta en la grid, y si no está añadirla. Por esto montamos una función que devuelva la columna de la ruta, y cree la nueva columna si la ruta no está:

Código Delphi [-]
Function obtener_Columna(ruta : String) : Integer;

Var i , resultado: Intreger;

Begin

Resultado := -1;

For i :0 1 to Grid.ColCount – 1 do

If Grid[0, i] = ruta then resultado = i;

If resultado = -1 then //no está la ruta

Begin

Grid.ColCount := Grid.ColCount + 1;

Resultado := Grid.ColCount – 1;

Grid[0, resultado] := ruta;

End;

Obtener_columna := resultado;

End;


Y recorremos los resultados del query montando la tabla:

Código Delphi [-]
Var oficinaActual : Integer;

Fila, Columna : Integer;

OficinaActual := -1;

Fila := 1;

While not(query.eof) do

Begin

If (query.fieldByName(‘oficina’).AsInteger <> oficinaActual then //cambio de oficina

Begin

Grid.Rowcount := Grid.RowCount + 1;

Fila := Grid.RowCount – 1;

Grid[Fila, 0] := query.fieldByName(‘oficina’).AsString

OficinaActual := query.fieldByName(‘oficina’).AsInteger;

End;

Columna := obtener_Columna(query.fieldByName(‘ruta’).AsStirng);

Grid[Fila, Columna] := query.fieldByName(‘Ingreso’).AsString

Query.next;

End;

Ten en cuenta que el código lo he escrito directamente aquí, o sea que habrá algun error, pero la idea espero que te hays quedado clara.

Un saludo

Edu

Última edición por jmariano fecha: 23-09-2005 a las 13:06:58. Razón: Formateo del código usando las etiquetas [delphi]
Responder Con Cita
  #3  
Antiguo 23-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
Thumbs up Gracias

Gracias lo voy a poner en practica
Responder Con Cita
  #4  
Antiguo 23-09-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Revisa estos Hilos:
http://www.clubdelphi.com/foros/arch...ncias+cruzadas
http://www.clubdelphi.com/foros/showthread.php?t=17253
Especialmente este post: http://www.clubdelphi.com/foros/show...95&postcount=2

Creo que te pueden ayudar mucho
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #5  
Antiguo 23-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
Gracias

Gracias los voy a checar

Saludos
Responder Con Cita
  #6  
Antiguo 23-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
Ayuda con SQL

Es muy útil sólo que en mi caso una oficina puede tener movimiento hasta en 500 rutas y tendria que poner fijos los numeros de las rutas para poder convertirlas a columnas y si en algún momento se da de alta otra ruta pues tendría que estar modificando el query.
Voy a utilizar esto combinado con tablas temporales para almacenar el movimiento de cada ruta.
Michismias gracias me ayudo un chorral como decimos por aca en el Norte.
Saludos
Responder Con Cita
  #7  
Antiguo 23-09-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
En que motor de base de datos quieres obtener los resultados que planteas?¿
__________________
Optimus Prime
Responder Con Cita
  #8  
Antiguo 23-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
En SQL 2000


gracias
Responder Con Cita
  #9  
Antiguo 27-09-2005
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
Ayer respondí en otra entrada, pero no estaba muy certero porque era tarde. Echale un vistazo a este tema, que está un poco más currado.

Query Columnas: SELECT distinct Ruta FROM TABLA ORDER BY Ruta
Ruta
A
B
C
...


Query Consulta: Es la que vamos a montar dinámicamente

Consulta.SQL.Clear;
Consulta.SQL.Add( 'SELECT Oficina ');
Columnas.Open;
while not Columnas.eof
begin
Consulta.SQL.Add( ', SUM(CASE Ruta WHEN '+Quotedstr(Columnas.Fields[0].AsString)+' THEN '+Ingreso+' ELSE 0 END) AS'+ Quotedstr(Columnas.Fields[0].AsString)';
Columnas.next;
end
Consulta.SQL.Add( ' FROM TABLA GROUP BY Oficina');

Consulta.Open

// Consulta antes de hacer el OPEN tendrá algo parecido a esto
SELECT Oficina
, SUM(CASE Ruta WHEN 'A'THEN '+Ingreso+' ELSE 0 END) AS A

, SUM(CASE Ruta WHEN 'B'THEN '+Ingreso+' ELSE 0 END) AS B

...

FROM TABLA GROUP BY Oficina

Cuando crees una nueva ruta, saldrá en la query de Columnas
oficina A B C D E
1 100 70 200
2 200 150 250
3 100 200

espero que te sirva de ayuda.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #10  
Antiguo 27-09-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
Sabes maite, hace poco encontre en la red un procedimiento que hacia esto de pivotear una tabla, busca en google por pivotear tabla y por ahi te debe aparecer, es que en estos momentos no recuerdo el link.
__________________
Optimus Prime
Responder Con Cita
  #11  
Antiguo 28-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
gracias
Responder Con Cita
  #12  
Antiguo 28-09-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
Hola maite, pues mira que buscando en mi desordenada memoria y con la ayuda de san google aqui esta en link que te comentaba, espero y te sirve Pivot_Table
__________________
Optimus Prime
Responder Con Cita
  #13  
Antiguo 29-09-2005
mayte mtz mayte mtz is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Poder: 0
mayte mtz Va por buen camino
Mil gracias te la bañaste como decimos por áca en el Norte de Mty, México.

Saludos
Responder Con Cita
  #14  
Antiguo 29-09-2005
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 21
edgusano Va por buen camino
Nos cuentas como te fue con el procedimiento, haber si te ha servido, saludos desde colombia.
__________________
Optimus Prime
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


La franja horaria es GMT +2. Ahora son las 04:27: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