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
-
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
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.
-
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
-
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)
-
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.
-
No se si sera la solucion mas adecuada pero yo lo estuve probando y me funciono... ;)
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:
-
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