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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.