Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Obtener dos veces el mismo campo. (https://www.clubdelphi.com/foros/showthread.php?t=7663)

Jose_Pérez 23-02-2004 15:02:03

Obtener dos veces el mismo campo.
 
Hola a todos:

Tengo una tabla de detalle de facturas con los siguientes campos:

Proveedor
Fecha
Precio
Articulo

Y deseo obtener el precio minimo y maximo de compra de un determinado artículo X por proveedor:

Select Proveedor,max(Precio) as PrecioMaximo,min(Precio) as PrecioMinimo Where Articulo=X group by Proveedor

Pero además, quiero saber la fecha en que se compró el artículo X a precio mínimo y la fecha en que se compró a precio máximo. ¿Cómo puedo hacerlo?

Un abrazo y gracias por vuestra atención.

jachguate 23-02-2004 15:47:10

Es imposible ayudarte sin saber que motor de datos usas...

haron 23-02-2004 16:51:43

puedes usar campos calculados.

tendrias dos campos calculados 'fecha_precio_minimo' y 'fecha_precio_maximo' y la siguiente query:

qryFechaPrecio:

Código:

select max(fecha) as fecha
from tabla
where articulo=:articulo
and proveedor=:proveedor
and precio=:precio

he puesto 'max(fecha)' porque podria haber mas de una fecha en la que se alcanza determinado precio por proveedor y articulo.

en el evento 'onCalcField' escribes:

Código:

// fecha en la que se alcanza el precio maximo:
qryFechaPrecio.close;
qryFechaPrecio.paramByName('articulo').value:=articulo; // variable global
qryFechaPrecio.paramByName('proveedor').value:=query['proveedor'];
qryFechaPrecio.paramByName('precio').value:=query['precio_maximo'];
qryFechaPrecio.open;
query['fecha_precio_maximo']:=qryFechaPrecio['fecha'];

// fecha en la que se alcanza el precio minimo:
qryFechaPrecio.close;
qryFechaPrecio.paramByName('articulo').value:=articulo; // variable global
qryFechaPrecio.paramByName('proveedor').value:=query['proveedor'];
qryFechaPrecio.paramByName('precio').value:=query['precio_minimo'];
qryFechaPrecio.open;
query['fecha_precio_maximo']:=qryFechaPrecio['fecha'];

la ventaja que tiene usar campos calculados en lugar de una unica select, es que divides las consultas en subconsultas mas sencillas que se pueden ejecutar en cualquier motor de bases de datos.

la desventaja es que aumentas el trafico en la red y disminuyes la velocidad de ejecucion.

Jose_Pérez 26-02-2004 13:56:17

Haron, la idea de utilizar campos calculados funcionan perfectamente. Además, el volumen da datos no es muy grande e, inicialmente, voy a tener funcionando la aplicación en en sólo equipo.

El único inconveniente que encuentro es no poder ordenar por los campos calculado... ¿o si se puede?.

Un abrazo y gracias.

haron 26-02-2004 16:39:09

Cita:

Empezado por Jose_Pérez
Haron, la idea de utilizar campos calculados funcionan perfectamente. Además, el volumen da datos no es muy grande e, inicialmente, voy a tener funcionando la aplicación en en sólo equipo.

El único inconveniente que encuentro es no poder ordenar por los campos calculado... ¿o si se puede?.

Un abrazo y gracias.

este es otro inconveniente que se me olvido mencionar.

hace tiempo puse la misma pregunta en el foro, que si se puede ordenar por campos calculados. me dijeron que no.

una solucion que se me ocurre, si necesitas ordenar por campos calculados y el volumen de datos no es muy grande, es olvidarte del TDBGrid y usar un TStringGrid para ordenar el resultado por cualquier campo.

la verdad que es una lastima que no se pueda. el componente TQuery deberia tener alguna opcion para hacerlo, ya que al fin y al cabo trabaja con una copia local y puede ordenar los resultados de esa copia.

marcoszorrilla 26-02-2004 16:52:00

Si vas a trabajar solamente local, una solución muy simple sería tener una tabla con los campos necesarios vacia y cuando actives la consulta, haces un insert sobre esta tabla que tendrá los índices que necesites, luego solamente te queda ordenar por el campo que quieras.

Un Saludo.

marcoszorrilla 26-02-2004 16:57:21

Movido por la curiosidad he hecho la siguiente prueba con Paradox:

Código:

Select Nombre, apellidos, apellidos||nombre as apel
 From alumnos
 order by 3
 
 //o esta otra
 
 Select Nombre, apellidos, apellidos||nombre as apel
  From alumnos
  order by apel

Y funciona correctamente.


Un Saludo.

Jose_Pérez 26-02-2004 18:55:47

Macoszorrilla, respecto a tu último ejemplo, ten en cuenta que en ese caso apel forma parte de la propia consulta SQL. Por algún motivo, los campos calculados creados desde el componente TQuery, en tiempo de diseño, no son reconocidos por el propio lenguaje SQL.

Un abrazo.

marcoszorrilla 26-02-2004 19:26:31

Tienes toda la razón, lo que quería indicar es que quizás convenga que lo calcules en la propia consulta, como en el ejemplo, ya sé que los campos calculados no se pueden utilizar para ordenar.

Un Saludo.

jachguate 27-02-2004 00:36:01

Cita:

Empezado por haron
el componente TQuery deberia tener alguna opcion para hacerlo, ya que al fin y al cabo trabaja con una copia local y puede ordenar los resultados de esa copia

.

Eso no siempre es cierto... pues depende de cuantos fetch se hagan en la apertura del cursor. A veces hay queries que contienen muchos registros, se abren y solamente se utilizan los primeros... porque el proceso es cancelado por el usuario, porque solo queria ver si abria, etc, etc.

imaginate, para ordenar por un campo calculado.. en ocasiones habria que hacer viajar miles (o millones) de registros del servidor al cliente solo para ordenarlo por un campo calculado (que en cualquier caso regularmente se puede hacer en el servidor, no?).

A mi me parece que está bien como esta...

haron 27-02-2004 00:55:36

Cita:

Empezado por jachguate
.

Eso no siempre es cierto... pues depende de cuantos fetch se hagan en la apertura del cursor. A veces hay queries que contienen muchos registros, se abren y solamente se utilizan los primeros... porque el proceso es cancelado por el usuario, porque solo queria ver si abria, etc, etc.

imaginate, para ordenar por un campo calculado.. en ocasiones habria que hacer viajar miles (o millones) de registros del servidor al cliente solo para ordenarlo por un campo calculado (que en cualquier caso regularmente se puede hacer en el servidor, no?).

A mi me parece que está bien como esta...

tienes razon. el componente TQuery es listo en el sentido que solo se trae los registros que necesita.

pero tambien te puedes traer todos los registros del servidor. por ejemplo el TADOQuery por defecto se trae todos los registros y trabaja con una copia local. en este caso si tiene sentido ordenar por un campo calculado.

de todas formas, tampoco esta de mas que se pueda ordenar un subconjunto del total.

la verdad es que en muchas ocasiones me he visto en un apuro porque no puedo ordenar por un campo calculado.

jachguate 27-02-2004 05:51:06

Cita:

Empezado por haron
tampoco esta de mas que se pueda ordenar un subconjunto del total.

que sentido tendría.

Si yo tengo el resultado de una consulta que genera (en el orden de los registros devueltos por el servidor):


nombre apellido
===============
Antonio Zapata
Juan Albizures
Pedro Fernandez
Jose Hernández

y me traigo los primeros dos registros, y los ordeno (el subconjunto) por apellido tengo:

nombre apellido
===============
Juan Albizures
Antonio Zapata

Que no son los primeros dos registros si tengo el conjunto completo, que seria:

nombre apellido
===============
Juan Albizures
Pedro Fernandez
Jose Hernández
Antonio Zapata


¿De que me sirve ordenar un subconjunto entonces?
:confused:

Ademas, el traerte todos los registros podria ser bueno o malo... dependiendo de la situación, pero si tenes una consulta que puede generarte muchos registros... no creo que sea buena idea correr el riesgo.

Hasta luego.

;)


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