Hola de nuevo.

Tengo esta consulta:

session.query(articulos, func.sum(func.coalesce(movimientos.uentrada, 0)).label('Entradas'),
func.sum(func.coalesce(movimientos.usalida, 0)).label('Salidas')).outerjoin(movimientos).filter(movimientos.id_almacen == al).group_by(articulos.id).all()

Si dejo el filter para obtener las sumas de un almacén, solo muestra los artículos que tengan movimientos en el almacén "al". El resto de artículos no aparecen.

Pero ¿ Y si quiero todos los artículos y con las sumas solo del almacén "al" ?

Saludos.


El 05/03/2016 a las 12:28, Ricardo Cárdenes escribió:
Un JOIN normal hace exactamente eso: un cruce entre las dos tablas mostrando las filas donde hay coincidencias. Es lo que se llama "inner join" (una combinación interna). Lo que tú quieres es que se muestren todas las filas de una de las tablas que participan en la combinación y que, de la otra, aparezcan los datos que coinciden. Esto se denomina "outer join" (combinación externa). Las combinaciones externas las tienes de dos tipos, por la izquierda y por la derecha, dependiendo de qué tabla tenga que salir entera. Es decir:

  .... FROM articulos LEFT OUTER JOIN movimientos ...

Obtendrá una nueva tabla donde aparecerán todas las filas de "artículos" (la tabla "por la izquierda") y también las filas de movimientos que correspondan. Para las filas de artículos sin movimientos, esas columnas aparecerán (normalmente) como valores nulos, no como 0. Eso te debería dará valores incorrectos para el sumatorio, porque NULL + valor numérico debería ser NULL. Una solución es usar, por ejemplo, la función COALESCE (es del estándar SQL y SQLite la soporta). Se usaría así:

  func.sum(func.coalesce(movimientos.uEntrada, 0))

si no recuerdo mal. Lo que hace COALESCE es tomar una serie de valores y devolver el primero que no sea NULL. De esa manera, si movimientos.uEntrada es NULL, devolverá 0.

Saludos,
Ricardo


_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a