Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Query con MIN (https://www.clubdelphi.com/foros/showthread.php?t=15143)

oliverinf 12-10-2004 16:34:04

Query con MIN
 
Hola a todos, uso Firebird 1.5 y necesito hacer una consulta de los "artículos" provistos por "proveedores" que dan el menor precio (del artículo). La tabla desde donde debo sacar los registros asocia los artículos con los proveedores y tiene los siguientes campos:
- Id_ArtProv (Identificador de registro)
- Id_Articulo (Identificador del Artículo)
- Id_Proveedor (Identificador del Proveedor)
- Precio (Precio del artículo)
- Descuento (Porcentaje de descuento que da el proveedor sobre el Precio)

El resultado que deseo obtener debe tener los siguientes campos
Id_Articulo, Id_Proveedor, Precio, Descuento, PrecioMinimo
donde PrecioMinimo debe ser el mínimo valor de Precio - (Precio * Descuento * 100).
Por ejemplo, si tengo en los registros:
Id_ArtProv Id_Articulo Id_Proveedor Precio Descuento
1 10 100 100 10
2 10 200 200 10
3 20 100 300 10

El resultado que deseo obtener es:
Id_Articulo Id_Proveedor Precio Descuento PrecioMinimo
10 100 100 10 90
20 100 300 10 270

Espero haber sido claro en el planteo de mi situación

Desde ya muchas gracias.

Guillermo

oliverinf 12-10-2004 22:20:18

Con el siguiente procedimiento almacenado logré obtener lo que deseo (aunque voy a seguir en la búsqueda de lograrlo con una sentencia SQL, sin usar un proc. almac.)

Código SQL [-]
CREATE PROCEDURE ARTSPROVS_PRECIOMINIMO 
RETURNS (
    ID_ART INTEGER,
    ID_PROV INTEGER,
    ARTNOMBRE VARCHAR (50),
    PROVNOMBRE VARCHAR (50),
    PREC NUMERIC (9, 2),
    DTO NUMERIC (5, 2),
    PRECIOMINIMO NUMERIC (9, 2))
AS
Declare variable Id_AAnterior integer;
BEGIN
   /* Con el Select del for obtengo los registros ordenados por
   Id_Articulo, PrecioMin. */
   Id_AAnterior = -1;
   for select A_P.ID_ARTICULO, A_P.ID_PROVEEDOR, A.NOMBRE, P.NOMBRE,
          A_P.PRECIO, A_P.DESCUENTO,
          MIN(A_P.PRECIO - (A_P.PRECIO * A_P.DESCUENTO / 100))
          from ARTICULO_PROVEEDOR A_P
             inner join ARTICULO A on (A_P.ID_ARTICULO = A.ID_ARTICULO)
             inner join PROVEEDOR P on (A_P.ID_PROVEEDOR = P.ID_PROVEEDOR)
          group by A_P.ID_ARTICULO, A_P.ID_PROVEEDOR, A.NOMBRE, P.NOMBRE,
          A_P.PRECIO, A_P.DESCUENTO
          order by A_P.ID_ARTICULO, 7
          into :Id_Art, :Id_Prov, :ArtNombre, :ProvNombre, :Prec, :Dto, :PrecioMinimo
      do begin
         if (Id_AAnterior <> Id_Art) then
            suspend;
         Id_AAnterior = Id_Art;
   end /* for */
END

Muchas gracias a todos.
Guillermo

marcoszorrilla 12-10-2004 22:22:16

Pues yo creo que con SQL involucrando los 2 campos no va a poder ser, porque tendrían que formar parte del Group By.

Pero veremos si alguien se atreve, aquí o en la Lista de Firebird.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 09:59:54.

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