Sv Community El Salvador

Soporte y Tecnología => Programación => Base de Datos => Mensaje iniciado por: freezer27 en abril 28, 2010, 09:08:58 am

Título: [Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: freezer27 en abril 28, 2010, 09:08:58 am
señores, yo tengo un problema con un query. La tabla es más o menos así:

FECHA_TOMA | CLIENTE | FECHA_VENC | GRUPO | ART_ID |QTY

27/03/2010   ANICETO   29/04/2010       90       0045      100
12/04/2010   ANICETO   21/10/2010       12       0045      100
27/05/2010   ANICETO   05/06/2011       90       0045      100

La cuestión es que necesito mostrar únicamente los registros donde aparezca una sola vez cada artículo combinado con el grupo, donde la fecha_toma sea más reciente. Es decir, en este caso solo tendría que mostrar algo así:

FECHA_TOMA | CLIENTE | FECHA_VENC | GRUPO | ART_ID |QTY

12/04/2010   ANICETO   21/10/2010       12       0045      100
27/05/2010   ANICETO   05/06/2011       90       0045      100

El query que tengo me funciona, pero SIN mostrar la FECHA_VENC ni QTY, ya que el group by haría que se repitieran las combinaciones de artículos-grupos

Código: [Seleccionar]
SELECT art_id, grupo, max(fecha_toma) referencia
  FROM t_inv_tomainv_fecha
 WHERE cli_id = 'ANICETO'
 group by grupo, art_id
 order by art_id

La pregunta del millón es, cómo hago para que muestre los registros del select de arriba, pero incluyendo los campos de FECHA_VENC y QTY, para que no me los repita el pinche group by.
Título: Re:[Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: Jaru en abril 28, 2010, 03:18:26 pm
yo haria el query y procesaria los datos con mi codigo, pero como dicen que eso es chambonada y no es eficiente, pues no me hagas caso
Título: Re:[Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: vlad en abril 28, 2010, 03:25:52 pm
Código: [Seleccionar]
SELECT * FROM test as t1 INNER JOIN (SELECT art_id, grupo, max(fecha_toma) fecha_toma FROM test WHERE cliente = 'ANICETO' group by grupo, art_id order by art_id) as t2 USING(art_id,grupo,fecha_toma)
Título: Re:[Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: tekun en abril 28, 2010, 03:38:15 pm
es fácil si tuvieras una PrimaryKey, será que si existe¿?


yo haria el query y procesaria los datos con mi codigo, pero como dicen que eso es chambonada y no es eficiente, pues no me hagas caso

Yo creo que tu problema es que programas solo en forma procedual y eso para mí es chambonada.... debes dejar de programar diciéndole a la maquina paso por paso que es lo que debe hacer.  Debes encontrar la manera de decirle a la maquina _QUE_ es lo que debe hacer, no _COMO_ hacerlo.  Si no consigues pensar de esa manera jamas lograras entender como hacer funcionar una base de datos.
Título: Re:[Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: JGuillen™ en abril 28, 2010, 04:11:14 pm
No se si sera la solucion mas adecuada pero yo lo estuve probando y me funciono...  ;)
Código: [Seleccionar]
SELECT FECHA_TOMA, CLIENTE, FECHA_VENC, GRUPO, ART_ID, QTY FROM TEST WHERE CLIENTE = 'ANICETO'
AND ART_ID IN (SELECT ART_ID FROM TEST WHERE CLIENTE = 'ANICETO' GROUP BY ART_ID, GRUPO)
AND GRUPO IN (SELECT GRUPO FROM TEST WHERE CLIENTE = 'ANICETO' GROUP BY ART_ID, GRUPO)
AND FECHA_TOMA IN (SELECT MAX(FECHA_TOMA) FROM TEST WHERE CLIENTE = 'ANICETO' GROUP BY ART_ID, GRUPO)


ahi solo es de sistutuir la palabra TEST por el nombre de tu tabla  :thumbsup:
Título: Re:[Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo
Publicado por: Camus de Acuario en abril 28, 2010, 05:01:11 pm
Código: [Seleccionar]
SELECT a.art_id, a.grupo, a.fecha_toma referencia, a.qty
  FROM t_inv_tomainv_fecha a
 WHERE a.cli_id = 'ANICETO'
     AND a.fecha_toma = (SELECT max(b.fecha_toma)
                                     FROM t_inv_tomainv_fecha b
                                    WHERE b.art_id = a.art_id
                                        AND b.grupo = a.grupo)
  ORDER by art_id