PDA

Ver la Versión Completa : Instrucción SQL


newtron
20-06-2019, 10:40:42
Hola a tod@s.


Tengo dos tablas, ARTICULOS y EXISTENCIAS. En la tabla EXISTENCIAS hay un registro con las existencias por cada artículo y almacén. Si quiero sumar en el campo EXISTT de la tabla ARTICULOS el total de existencias (campo EXISTENCIA) que hay en la tabla EXISTENCIAS paso la siguiente instrucción:



UPDATE ARTICULOS
SET EXISTT=SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)



Esto funciona correctamente pero tiene un problema, si en la tabla EXISTENCIAS no hay registros de un artículo determinado el campo sumatorio EXISTT se queda con valor NULL y quisiera que quedara 0.


he probado con esto:



UPDATE ARTICULOS
SET EXISTT=SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)
AND (ARTICULO IN (SELECT ARTICULO FROM EXISTENCIAS))



y con esto:




UPDATE ARTICULOS
SET EXISTT=CAST(SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO) AS FLOAT)



pero nada, siguen cogiendo valor NULL los artículos que no encuentra registros en la tabla EXISTENCIAS


¿Algún ilustre SQLero puede iluminarme?


Gracias y un saludo

bucanero
20-06-2019, 10:59:59
Hola Newtron

lo puedes hacer con dos sentencias, primero actualizas a 0 el stocks de los artículos que no tienen existencias y luego el stock de los que si tienen existencias:

UPDATE ARTICULOS
SET EXISTT=0
WHERE NOT ARTICULOS.CODIGO IN (SELECT EXISTENCIAS.ARTICULO FROM EXISTENCIAS);

UPDATE ARTICULOS
SET EXISTT=(SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO))
WHERE ARTICULOS.CODIGO IN (SELECT EXISTENCIAS.ARTICULO FROM EXISTENCIAS);

O si lo quieres hacer en una sola instrucción, en MySQL existe la funcion IFNULL que establece un valor por defecto para cuando un campo es null, imagino que otros motores de BBDD tendran algo similar, si no siempre se puede utilizar el standar CASE WHEN ... ELSE ... END y se puede hacer de esta forma:
UPDATE ARTICULOS
SET EXISTT = ifNull((SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE (ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO)), 0)


aquí tienes otra forma de plantear la consulta, la diferencia esta en el numero de consultas que realiza el motor de BD para ejecutar la sentencia. Comprueba con cual ganas mas en rendimiento, si con esta forma o con la anterior

UPDATE ARTICULOS
LEFT JOIN (
SELECT ARTICULO, SUM(EXISTENCIAS) AS STOCK
FROM EXISTENCIAS
GROUP BY ARTICULO
) STOCK ON STOCK.ARTICULO=ARTICULOS.CODIGO
SET ARTICULOS.EXISTT = ifNull(STOCK.stock, 0)

un saludo

newtron
20-06-2019, 11:48:02
Bucanero.


Por lo menos en la base de datos que yo uso (ElevateDB) la sintaxis de las instrucciones que me propones no funciona pero ciertamente me has dado la pista y usando COALESCE si que he podido resolver el tema. :)




UPDATE ARTICULOS
SET EXISTT = COALESCE((SELECT SUM(EXISTENCIA) FROM EXISTENCIAS WHERE ARTICULOS.CODIGO=EXISTENCIAS.ARTICULO),0)



Gracias por tu ayuda y un saludo