PDA

Ver la Versión Completa : consulta en sql


mayte mtz
23-09-2005, 00:37:09
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
:eek:

epuigdef
23-09-2005, 12:27:29
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á:


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:


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

mayte mtz
23-09-2005, 16:50:07
Gracias lo voy a poner en practica;)

vtdeleon
23-09-2005, 18:17:44
Saludos

Revisa estos Hilos:
http://www.clubdelphi.com/foros/archivo/viewtopic.php?t=16133&highlight=referencias+cruzadas
http://www.clubdelphi.com/foros/showthread.php?t=17253
Especialmente este post: http://www.clubdelphi.com/foros/showpost.php?p=73795&postcount=2

Creo que te pueden ayudar mucho

mayte mtz
23-09-2005, 19:32:47
Gracias los voy a checar

Saludos :)

mayte mtz
23-09-2005, 19:39:14
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;)

edgusano
23-09-2005, 22:27:21
En que motor de base de datos quieres obtener los resultados que planteas?¿

mayte mtz
23-09-2005, 22:35:28
En SQL 2000


gracias

fjcg02
27-09-2005, 17:50:19
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

edgusano
27-09-2005, 23:11:49
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.

mayte mtz
28-09-2005, 20:26:04
gracias :)

edgusano
28-09-2005, 21:35:22
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 (http://www.webmagic.cl/rcrosstabsql.php)

mayte mtz
29-09-2005, 15:40:48
Mil gracias te la bañaste como decimos por áca en el Norte de Mty, México.

Saludos
:p

edgusano
29-09-2005, 22:02:49
Nos cuentas como te fue con el procedimiento, haber si te ha servido, saludos desde colombia.