Problem adding SUM () in query

I have this SQL Query but when wanting to add a SUM to column CANT_DISPONIBLE it throws me error, this is my query

select EB.ARTICULO,EB.BODEGA,EB.CANT_DISPONIBLE,EB.CANT_RESERVADA
,EB.CANT_TRANSITO,EB.CANT_REMITIDA,SUM(EB.CANT_DISPONIBLE) X
from EXISTENCIA_BODEGA EB,ARTICULO CL
where 
 EB.ARTICULO=CL.ARTICULO AND
(EB.CANT_DISPONIBLE>0 or EB.CANT_REMITIDA>0 or 
 EB.CANT_TRANSITO>0 or EB.CANT_RESERVADA>0)
and (SUBSTRING(EB.BODEGA,1,1)='T'
OR SUBSTRING(EB.BODEGA,1,2)='VM'
OR SUBSTRING(EB.BODEGA,1,2)='CS')
and SUBSTRING(EB.BODEGA,1,2)<>'TA'
AND CL.CLASIFICACION_1  IN ('1010','1007')
order by EB.BODEGA

The error is for:

Group By: Column 'EXISTENCIA_BODEGA.ARTICULO'
is invalid in the select list because it is not contained
in either an aggregate function or the GROUP BY clause.
 2
Author: Black Sheep, 2016-05-16

2 answers

When you use an aggregate function (such as SUM) in an SQL the fields in the SELECT that are not included in aggregate functions must be specified in the group by clause.

The correctness of your query depends on what you want to get.

For example if you want to get the sums of the quantities for each item and warehouse:

    SELECT EB.ARTICULO, EB.BODEGA, 
        SUM(EB.CANT_DISPONIBLE),SUM(EB.CANT_RESERVADA), 
        SUM(EB.CANT_TRANSITO), SUM(EB.CANT_REMITIDA), 
        SUM(EB.CANT_DISPONIBLE) X
    FROM EXISTENCIA_BODEGA EB, ARTICULO CL
    WHERE 
        EB.ARTICULO=CL.ARTICULO AND
        (EB.CANT_DISPONIBLE>0 OR EB.CANT_REMITIDA>0 OR
            EB.CANT_TRANSITO>0 OR EB.CANT_RESERVADA>0)
        AND (SUBSTRING(EB.BODEGA,1,1)='T'
        OR SUBSTRING(EB.BODEGA,1,2)='VM'
        OR SUBSTRING(EB.BODEGA,1,2)='CS')
        AND SUBSTRING(EB.BODEGA,1,2)<>'TA'
        AND CL.CLASIFICACION_1  IN ('1010','1007')
    GROUP BY EB.ARTICULO, EB.BODEGA
    ORDER BY EB.BODEGA
 2
Author: Asier Villanueva, 2016-05-16 18:53:43

As I said, You only need to add the clause group by (as indicated by the error strace) since you have added the function sum in particular your query should look like this

SELECT EB.ARTICULO,
    EB.BODEGA,
    EB.CANT_DISPONIBLE,
    EB.CANT_RESERVADA ,
    EB.CANT_TRANSITO,
    EB.CANT_REMITIDA,
    SUM(EB.CANT_DISPONIBLE) X
FROM EXISTENCIA_BODEGA EB, ARTICULO CL
WHERE EB.ARTICULO            = CL.ARTICULO
AND (EB.CANT_DISPONIBLE      > 0
OR EB.CANT_REMITIDA          > 0
OR EB.CANT_TRANSITO          > 0
OR EB.CANT_RESERVADA         > 0)
AND (SUBSTRING(EB.BODEGA,1,1) = 'T'
OR SUBSTRING(EB.BODEGA,1,2)   = 'VM'
OR SUBSTRING(EB.BODEGA,1,2)   = 'CS')
AND SUBSTRING(EB.BODEGA,1,2) <> 'TA'
AND CL.CLASIFICACION_1      IN ('1010','1007')
GROUP BY EB.ARTICULO,
    EB.BODEGA,
    EB.CANT_DISPONIBLE,
    EB.CANT_RESERVADA ,
    EB.CANT_TRANSITO,
    EB.CANT_REMITIDA
ORDER BY EB.BODEGA;
 1
Author: Rosendo Ropher, 2016-05-16 19:02:03