Autor Tema: [Ayuda con SQL] mostrar los registros donde aparezca una sola vez el articulo  (Leído 4350 veces)

0 Usuarios y 1 Visitante están viendo este tema.

freezer27

  • Visitante
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.
« Última Modificación: abril 28, 2010, 03:00:18 pm por vlad »

Desconectado Jaru

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
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
N/A

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
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)

Desconectado tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
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.
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado JGuillen™

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Mensajes: 3449
  • PHP,C#,MySQL,SQL
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:

Desconectado Camus de Acuario

  • The Communiter-
  • *
  • Mensajes: 8455
  • Ōrora Ekusukyūshon!
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