Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta en sql (https://www.clubdelphi.com/foros/showthread.php?t=25458)

mayte mtz 23-09-2005 00:37:09

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
: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á:

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

mayte mtz 23-09-2005 16:50:07

Gracias
 
Gracias lo voy a poner en practica;)

vtdeleon 23-09-2005 18:17:44

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

mayte mtz 23-09-2005 19:32:47

Gracias
 
Gracias los voy a checar

Saludos :)

mayte mtz 23-09-2005 19:39:14

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;)

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

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.


La franja horaria es GMT +2. Ahora son las 17:08:23.

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