none
sumar y agrupar datos en sql server RRS feed

  • Pregunta

  • Buen dia a todos:

    Adjunto imagen de la consulta que tengo, por favor si pueden apoyarme necesito obtener lo siguiente :

    002 - REPUESTOS - 20 - 103.20

    003 - OTROS - 1 - 749

    UTILIZO EL ISNULL PORQUE AL CONSULTAR LA TABLA ALGUNOS PRODUCTOS NO SE COMPRARON POR LO TANTO NO PUEDO SUMAR LAS COMPRAS QUE TIENE, PERO SI SUMAR SU COSTO PROMEDIO.

    CUANDO LE PONGO SUM ANTES DEL ISNULL PARA QUE ME SUME TODOS LOS VALORES AL COSTO ME SALE ERROR PORQUE

    LA FUNCION NO SE PUEDE UTILIZAR ANTES DEL ISNULL, Y NO SE COMO HACERLO. AGRADECERIA SU APOYO.


    Armando

    lunes, 24 de julio de 2017 6:31

Respuestas

  • El mensaje de error menciona que no es posible operar, en una función de agregado, una columna que pertenece a una consulta externa junto con una columna que pertenece a la sub-consulta. ¿La solución?, sumarizar ambas columnas por separado.

    SELECT
        f.Codigo, f.Descripcion, SUM(ds.CantUnidad * pp.Equivalencia) AS UnidVendidas,
        SUM(ds.CantUnidad * pp.Equivalencia) * COALESCE((
    	   SELECT (SUM(dc.PrecioVenta) * SUM(pp.Equivalencia) - 
    		  SUM(dc.DsctoUnitario))/SUM(dc.CantUnidad)
    	   FROM
    		  Tab_DetEntrada dc 
    		  INNER JOIN Tab_Entrada pc ON dc.IdEntrada = pc.IdEntrada
    		  INNER JOIN Tab_Stock sto ON dc.IdStock = sto.IdStock
    		  INNER JOIN Tab_Productos prod ON sto.IdProducto = prod.IdProducto
    		  INNER JOIN Tab_Familia fm ON prod.IdFamilia = fm.IdFamilia
    	   WHERE f.IdFamilia = fm.IdFamilia
    	   GROUP BY fm.IdFamilia), SUM(p.CostoPromedio)) AS ValorCosto
    FROM
        Tab_DetSalida ds
        INNER JOIN Tab_Salidas sal ON ds.idSalida = sal.idSalida
        INNER JOIN Tab_PresentacionProd pp ON ds.IdPresenProducto = pp.idPreProd
        INNER JOIN Tab_Productos p ON pp.IdProducto = p.IdProducto
        INNER JOIN Tab_Familia f ON f.IdFamilia = p.IdFamilia
    GROUP BY f.IdFamilia, f.Codigo, f.Descripcion
    ORDER BY f.Codigo;
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Moderador M lunes, 31 de julio de 2017 3:56
    martes, 25 de julio de 2017 15:06

Todas las respuestas

  • Hola Armando,

    Para poder orientarte, necesitamos que pegues tu código ya que la imagen no se aprecia mucho la sintaxis. 


    Si la respuesta te ayuda, pues márcala como respuesta y vota. Saludos desde Santiago de Chile.

    lunes, 24 de julio de 2017 14:04
  • Si buscas un resumen por familia no agrupes por producto.

    SELECT
        f.Codigo, f.Descripcion, SUM(ds.CantUnidad * pp.Equivalencia) AS UnidVendidas,
        SUM(ds.CantUnidad * pp.Equivalencia) * COALESCE((
    	   SELECT (SUM(dc.PrecioVenta * pp.Equivalencia) - SUM(dc.DsctoUnitario))/SUM(dc.CantUnidad)
    	   FROM
    		  Tab_DetEntrada dc 
    		  INNER JOIN Tab_Entrada pc ON dc.IdEntrada = pc.IdEntrada
    		  INNER JOIN Tab_Stock sto ON dc.IdStock = sto.IdStock
    		  INNER JOIN Tab_Productos prod ON sto.IdProducto = prod.IdProducto
    		  INNER JOIN Tab_Familia fm ON prod.IdFamilia = fm.IdFamilia
    	   WHERE f.IdFamilia = fm.IdFamilia AND prod.IdProducto = p.IdProducto
    	   GROUP BY fm.IdFamilia), SUM(p.CostoPromedio)) AS ValorCosto
    FROM
        Tab_DetSalida ds
        INNER JOIN Tab_Salidas sal ON ds.idSalida = sal.idSalida
        INNER JOIN Tab_PresentacionProd pp ON ds.IdPresenProducto = pp.idPreProd
        INNER JOIN Tab_Productos p ON pp.IdProducto = p.IdProducto
        INNER JOIN Tab_Familia f ON f.IdFamilia = p.IdFamilia
    GROUP BY f.IdFamilia, f.Codigo, f.Descripcion
    ORDER BY f.Codigo;
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Moderador M martes, 25 de julio de 2017 15:06
    lunes, 24 de julio de 2017 14:26
  • Gracias por tu tiempo. Una consulta para que sirve la instrucción COALESCE

    Saludos


    Armando

    lunes, 24 de julio de 2017 19:29
  • Una consulta para que sirve la instrucción COALESCE

    La expresión COALESCE() tiene similar uso a la función ISNULL(), sin embargo hay algunas diferencias como por ejemplo que COALESCE(Expr1, Expr2, Expr3, ..., ExprN) permite la evaluación de n expresiones mientras que la función ISNULL(Expr1, Valor de reemplazo) evalúa una sola expresión y la reemplaza por el segundo argumento. Otra diferencia es que COALESCE es una función estándar (ISO/ANSI SQL) mientras que la función ISNULL() es una función especifica de T-SQL. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 25 de julio de 2017 0:33
  • Hola, corri la consulta y primero me salio que el Tab_Productos.IdProducto no estaba agregado en la clausula Group by. Lo agregue y luego me salio este error :

    Se han especificado múltiples columnas en una expresión de agregado que contiene una referencia externa. Si una expresión agregada contiene una referencia externa, ésta deberá ser la única columna a la que se haga referencia en la expresión.




    Armando

    martes, 25 de julio de 2017 2:00
  • Envio el query:

    select F.Codigo, F.Descripcion, sum(ds.CantUnidad*pp.Equivalencia) as UnidVendidas,


    sum((ds.CantUnidad*pp.Equivalencia))*ISNULL((select (sum(dc.PrecioVenta*dc.CantUnidad)-sum(dc.DsctoUnitario))/sum(dc.CantUnidad)
    from Tab_DetEntrada dc inner join Tab_Entrada pc
    on dc.IdEntrada=pc.IdEntrada
    inner join Tab_Stock sto on dc.IdStock=sto.IdStock inner join Tab_Productos prod on sto.IdProducto=prod.IdProducto
    inner join Tab_Familia fm on fm.IdFamilia=prod.IdFamilia
    --where p.IdFamilia=fm.IdFamilia and sto.IdProducto=p.IdProducto), P.CostoPromedio) as ValorCosto
    where p.IdFamilia=fm.IdFamilia), P.CostoPromedio) as ValorCosto
    from Tab_DetSalida ds
    inner join Tab_Salidas sal on sal.idSalida=ds.idSalida
    inner join Tab_PresentacionProd pp on ds.IdPresenProducto=pp.idPreProd
    inner join Tab_Productos p on pp.IdProducto=p.IdProducto
    inner join Tab_Familia f on f.IdFamilia=p.IdFamilia
    group by f.Codigo, F.Descripcion, P.IdFamilia, P.IdProducto, P.CostoPromedio
    order by F.Codigo


    Armando

    martes, 25 de julio de 2017 3:14
  • Hola, corrí la consulta y primero me salio que el Tab_Productos.IdProducto no estaba agregado en la clausula Group by. Lo agregue y luego me salio error

    No, reitero, no debes agrupar por producto cuando el resumen es por familia. He actualizado el script, ejecuta nuevamente y si tienes algún nuevo error lo haces saber.

    SELECT
        f.Codigo, f.Descripcion, SUM(ds.CantUnidad * pp.Equivalencia) AS UnidVendidas,
        SUM(ds.CantUnidad * pp.Equivalencia) * COALESCE((
    	   SELECT (SUM(dc.PrecioVenta * pp.Equivalencia) - SUM(dc.DsctoUnitario))/SUM(dc.CantUnidad)
    	   FROM
    		  Tab_DetEntrada dc 
    		  INNER JOIN Tab_Entrada pc ON dc.IdEntrada = pc.IdEntrada
    		  INNER JOIN Tab_Stock sto ON dc.IdStock = sto.IdStock
    		  INNER JOIN Tab_Productos prod ON sto.IdProducto = prod.IdProducto
    		  INNER JOIN Tab_Familia fm ON prod.IdFamilia = fm.IdFamilia
    	   WHERE f.IdFamilia = fm.IdFamilia
    	   GROUP BY fm.IdFamilia), SUM(p.CostoPromedio)) AS ValorCosto
    FROM
        Tab_DetSalida ds
        INNER JOIN Tab_Salidas sal ON ds.idSalida = sal.idSalida
        INNER JOIN Tab_PresentacionProd pp ON ds.IdPresenProducto = pp.idPreProd
        INNER JOIN Tab_Productos p ON pp.IdProducto = p.IdProducto
        INNER JOIN Tab_Familia f ON f.IdFamilia = p.IdFamilia
    GROUP BY f.IdFamilia, f.Codigo, f.Descripcion
    ORDER BY f.Codigo;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 25 de julio de 2017 3:55
  • Hola buen dia, nuevamente gracias por tu tiempo.

    Ejecute la query, me sale el siguiente error :

    Se han especificado múltiples columnas en una expresión de agregado que contiene una referencia externa. Si una expresión agregada contiene una referencia externa, ésta deberá ser la única columna a la que se haga referencia en la expresión

    Saludos


    Armando

    martes, 25 de julio de 2017 14:38
  • El mensaje de error menciona que no es posible operar, en una función de agregado, una columna que pertenece a una consulta externa junto con una columna que pertenece a la sub-consulta. ¿La solución?, sumarizar ambas columnas por separado.

    SELECT
        f.Codigo, f.Descripcion, SUM(ds.CantUnidad * pp.Equivalencia) AS UnidVendidas,
        SUM(ds.CantUnidad * pp.Equivalencia) * COALESCE((
    	   SELECT (SUM(dc.PrecioVenta) * SUM(pp.Equivalencia) - 
    		  SUM(dc.DsctoUnitario))/SUM(dc.CantUnidad)
    	   FROM
    		  Tab_DetEntrada dc 
    		  INNER JOIN Tab_Entrada pc ON dc.IdEntrada = pc.IdEntrada
    		  INNER JOIN Tab_Stock sto ON dc.IdStock = sto.IdStock
    		  INNER JOIN Tab_Productos prod ON sto.IdProducto = prod.IdProducto
    		  INNER JOIN Tab_Familia fm ON prod.IdFamilia = fm.IdFamilia
    	   WHERE f.IdFamilia = fm.IdFamilia
    	   GROUP BY fm.IdFamilia), SUM(p.CostoPromedio)) AS ValorCosto
    FROM
        Tab_DetSalida ds
        INNER JOIN Tab_Salidas sal ON ds.idSalida = sal.idSalida
        INNER JOIN Tab_PresentacionProd pp ON ds.IdPresenProducto = pp.idPreProd
        INNER JOIN Tab_Productos p ON pp.IdProducto = p.IdProducto
        INNER JOIN Tab_Familia f ON f.IdFamilia = p.IdFamilia
    GROUP BY f.IdFamilia, f.Codigo, f.Descripcion
    ORDER BY f.Codigo;
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Moderador M lunes, 31 de julio de 2017 3:56
    martes, 25 de julio de 2017 15:06