Creo que esta es una versión mas simple y por lo tanto mas "entendible"
- Se recorren los registros agrupados por albaran, fecha y articulo.
- Dentro de cada registro que se devuelve, se realizan dos subselect que suma de esa misma tabla los registros que correspondan con ese alabran, fecha y articulo.
- Un subselect filtra los que el precio son iguales a 0.
- El otro subselect filtra los que el precio son distintos de 0.
- A cada uno de estas sumas se les asinga un nombre (cant_pr y cant_sin).
- Opcionalmente se podría ordenar, pero el group by ya lo hace...
Código SQL
[-]
select
v.albaran, v.fecha, v.articulo,
(select sum(cantidad)
from ventaslineas
where
albaran = v.albaran and
fecha = v.fecha and
articulo = v.articulo and
precio <> 0) as cant_pr,
(select sum(cantidad)
from ventaslineas
where
albaran = v.albaran and
fecha = v.fecha and
articulo = v.articulo and
precio = 0) as cant_sin
from ventaslineas v
group by v.albaran, v.fecha, v.articulo