Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Group by en firebird

Estoy desde hace rato tratando de resolver la cuestión y no doy en la tecla. Tengo dos tablas:

Insumos
cod_insumo, descripcion, estado, cod_proveedor

Listas_Precios
cod_lista, cod_insumo, precio, tasa_gcia, fecha_ini

Aquí cod_insumo viene desde Insumo como clave externa. fecha_ini indica desde cuando el insumo tendrá el precio "precio".

Lo que quiero ahora es mostrar la lista de precios del día en curso. Lo hago de la siguiente manera:

Código SQL [-]
Select i.cod_insumo, i.descripcion, 
tasa_gcia, MAX(lp.fecha_ini)

From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = lp.cod_insumo
Where i.cod_proveedor = 2
and i.estado = 'A' and lp.fecha_ini <= current_date
Group by  i.cod_insumo

La cuestión sería que para obtener el precio actual hay que pedir que fecha_ini <= current_date y fecha_ini sea Máxima entre todas las fechas posibles, pues se podrían poner mas registros de precios para el mismo producto variando la fecha de inicio para que justamente haya un cambio automático del precio al cambiar el día.

Esta consulta no funciona, pues me dice que en el Group by le faltan campos del Select para agrupar. Es decir, pide que estén "cod_insumo, descripcion,
tasa_gcia" si hago eso no puedo agrupar de la manera "correcta" y me aparece por ejemplo el mismo producto con dos precios distintos, esto es claro porque en el agrupamiento cambia el campo precio y ya lo considera como de otro conjunto. La consulta como la muestro sería la forma de resolver el problema, ahora, en firebird no funciona. ¿Cómo podría variarse esta consulta para obtener el resultado?

Espero haber sido claro. Sino pregunten y lo hago lo mas detallado posible.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 04-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Agrega MIN(campo) o MAX(campo) y el GROUP BY te funcionará.

Código SQL [-]
Select i.cod_insumo, min(i.descripcion), min(tasa_gcia), MAX(lp.fecha_ini)
From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = lp.cod_insumo
Where i.cod_proveedor = 2
and i.estado = 'A' and lp.fecha_ini <= current_date
Group by  i.cod_insumo
Responder Con Cita
  #3  
Antiguo 04-09-2008
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Cuando se hace un group by hay que poner en la select todos los campos por los que se está agrupando, y sólo permite otros campos cuando son resultado de alguna operación (sum, count, etc.)

por tanto, tu consulta debería ser así:

Código SQL [-]
Select i.cod_insumo, i.descripcion, tasa_gcia, MAX(lp.fecha_ini)From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = lp.cod_insumoWhere i.cod_proveedor = 2and i.estado = 'A' and lp.fecha_ini <= current_dateGroup by  i.cod_insumo, i.descripcion, tasa_gcia

Espero haberte ayudado
Un saludo
Responder Con Cita
  #4  
Antiguo 04-09-2008
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Lo siento, pero no se donde he pulsado que me ha quedado un código "lamentable". El asunto es que en la clausula group by tienen que estar los campos individuales de la select.

Un saludo
Responder Con Cita
  #5  
Antiguo 04-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
La cuestión sería que para obtener el precio actual hay que pedir que fecha_ini <= current_date y fecha_ini sea Máxima entre todas las fechas posibles, pues se podrían poner mas registros de precios para el mismo producto variando la fecha de inicio para que justamente haya un cambio automático del precio al cambiar el día.
Leyendo esto creo que deberías cambiar lo siguiente:
Código SQL [-]
Select i.cod_insumo, min(i.descripcion), min(tasa_gcia), MAX(lp.fecha_ini)
From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = lp.cod_insumo
Where i.cod_proveedor = 2
and i.estado = 'A' and lp.fecha_ini = (select max(fecha_ini) from Listas_Precios)
Group by  i.cod_insumo
Responder Con Cita
  #6  
Antiguo 04-09-2008
Avatar de tcp_ip_es
tcp_ip_es tcp_ip_es is offline
No confirmado
 
Registrado: ago 2003
Ubicación: Madrid
Posts: 635
Poder: 0
tcp_ip_es Va por buen camino
La función Max te devuelve un solo valor, con lo que no hacen falta agrupaciones, otra cosa es que tengas varias fechas iguales máximas, con lo que primero tienes que sacar el máximo y luego agrupar...

Código SQL [-]
Select i.cod_insumo, i.descripcion, tasa_gcia, lp.fecha_ini 
From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = i.cod_insumo
Where (i.cod_proveedor = 2) and (i.estado = 'A') and (lp.fecha_ini in 
(select max(lp.fecha_ini) as maximafx
from listaprecios lp 
Where lp.fecha_ini <= current_date))
group by i.cod_insumo, i.descripcion, tasa_gcia, lp.fecha_ini
Responder Con Cita
  #7  
Antiguo 04-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Ayudas muy valiosas

La verdad es que les estoy eternamente agradecidos. De todas las opciones planteadas he sacado una muy buena resolución.

Gracias de nuevo.

Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #8  
Antiguo 05-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Lightbulb ¡¡Al fin!!

Bueno compañeros, vuelvo a agradecer su invalorable ayuda en el tema. Después de varias noches de insomnio por no poder resolver el tema he llegado a una solución viable y creo que confiable. Con gusto la comparto:

Resulta que tengo dos tablas, entre otras, una de insumos y otras de precios de esos insumos. Estos precios van variando en el tiempo por lo cual un insumo puede tener muchos precios, EN EL TIEMPO. De ahí la existencia del campo fecha_ini en la tabla de precios (listas_precios), el cual indica desde cuando tiene valor el precio para ese insumo. Bien, con eso sería:

Insumos
cod_insumo, descripcion, estado

Listas_Precios
cod_lista, cod_insumo, precio, gcia, iva, adicional_menor, fecha_ini

Lo que queremos hacer es obtener el listado de precios de los productos, pero con el precio vigente al día. Con la dinámica de los precios algunos de ellos pudieron haber cambiado ayer, anteayer, la semana pasada, el mes pasado; otros tienen previstos cambios para le lunes que viene, para el mes que viene y así. Una gran variedad por cierto.
Para obtener la lista de precios a hoy tenemos la siguiente norma: Son aquellos que su fecha de inicio de vigencia (fecha_ini) <= hoy Y que fecha_ini sea Máxima (esto porque el producto tiene muchos precios que variaron en el tiempo)

Con estas condiciones y poniendo todos los campos que se requieren mostrar la consulta queda de esta manera:

Código SQL [-]
Select i.cod_insumo, i.descripcion, gcia, lp.fecha_ini, lp.precio,
lp.adicional_menor, lp.iva
From Insumos i LEFT OUTER JOIN Listas_Precios lp ON i.cod_insumo = i.cod_insumo
Where i.cod_proveedor = :codigo --2
and i.estado_insumo = 'A'
/* Devuelve la fecha máxima de un listado de fechas menores o iguales a current_date, por cada insumo en particular */
and lp.fecha_ini in (Select MAX(lp2.fecha_ini) From listas_precios lp2
                     Where lp2.fecha_ini <= current_date
                     and i.cod_insumo = lp2.cod_insumo
                     and lp.cod_insumo = lp2.cod_insumo)

Y con esto tenemos arreglado el asunto.

Muchas gracias a todos.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
uso del Group By esimon SQL 8 05-02-2008 18:14:10
Impresion de group header group footer Manuel Impresión 3 11-11-2007 01:05:23
consultas anidadas: group by dentro otro group by DobleSiete SQL 7 31-01-2005 14:59:31
Group Header, Detail y Footer Group en la misma pagina MarcelRuz Impresión 0 20-04-2004 23:27:14
Problemas con GROUP BY en firebird verm83 SQL 7 15-04-2004 11:31:26


La franja horaria es GMT +2. Ahora son las 00:45:30.


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
Copyright 1996-2007 Club Delphi