none
SUMAR DENTRO DE UNA VISTA RRS feed

  • Pregunta

  • Hola,

    Estoy haciendo una pequeña vista que me muestra campos de varias tablas. Voy recorriendo la tabla principal para que muestre algunos campos como número de documento, PRODUCTO, cantidad, fecha, ...

    Lo único que querría sería mostrar además de esos datos, la suma de todas las cantidades para el número de documento que muestra en la línea. Ejemplo:

    DOCUMENTO                 PRODUCTO     CANTIDAD                           FECHA    TOTALCANTIDAD

    19202                  PROD1            10                1/2/2016       20

    19202                  PROD2            10                 1/2/2016      20

    19203                  PROD1             5                  2/2/2016       5

    19204                  PROD2             7                   2/2/2016      10

    19204                  PROD3             3                   2/2/2016      10

    Sé que es muy sencillo pero me estoy liando...

    muchas gracias.

    Saludos,



    miércoles, 8 de febrero de 2017 9:52

Respuestas

Todas las respuestas

  • Hola que tal Nachoju, aquí te paso el ejemplo de como puedes hacerlo según lo que nos comentas.

    use tempdb
    go

    create table Vista(
    Documento int,
    Producto varchar(10),
    Cantidad int,
    Fecha date)

    insert into Vista(Documento,Producto,Cantidad,Fecha)
                values(19202,'PROD1',10,'20160201'),
         (19202,'PROD2',10,'20160201'),
     (19203,'PROD1',5,'20160202'),
     (19204,'PROD2',7,'20160202'),
     (19204,'PROD3',3,'20160202')

    --Consulta sumando cantidades
    Select Documento,Producto,Cantidad,Fecha,
           sum(Cantidad) over(partition by Documento) Total_Cantidad
    from Vista

    Cualquier cosa nos comentas,

    Saludos,

    Jorge Muchaypìña G.


    Business Intelligence Analyst

    miércoles, 8 de febrero de 2017 10:04
  • Muchas gracias Jorge. Me va perfecto. 

    Esa cifra la necesitaba porque tengo que hacer un reparto de costes por línea, y estos costes los tengo para todas las líneas.

    Si hago el SUM OVER... como columna me funciona, pero si lo intento meter dentro de una fórmula para calcular el coste por línea me falla... ¿qué puedo estar haciendo mal?


    PV.CosteTransporte / NULLIF ((SUM(ILE.Quantity) OVER (PARTITION by ILE.[Documento])), 0) * ILE.Quantity

    donde: pv.costetransporte --> coste transporte para ese documento

    SUM(ILE.Quantity) OVER (PARTITION by ILE.[Documento]) --> total de cantidad para ese documento

    ILE.QUANTITY --> Cantidad de esa línea

    He añadido el nullif para evitar el error de dividir por 0

    Muchas gracias!!

    miércoles, 8 de febrero de 2017 10:58
  • Nachoju,

    ¿Obtienes algún mensaje de error? Si es así deberías mostrar el mensaje, ayuda mucho a entender el problema/error que podrías tener.

    {...} He añadido el nullif para evitar el error de dividir por 0

    Pero lo que haces es propiciar el cero en caso la sumatoria resulte NULL, no lo evitas. Sin embargo, ¿en qué casos la sumatoria retorna NULL? ¿No todas las líneas tienen una cantidad?, ¿cómo obtienes el dato del coste de ventas?

    Para mi la expresión queda perfecta:

    (PV.CosteTransporte / SUM(ILE.Quantity) OVER (PARTITION by ILE.[Documento])) * ILE.Quantity

    Aunque las operaciones con el mismo nivel de operandos se resuelven de izquierda a derecha las separo entre paréntesis para dejar claro el sentido de la operación: obtengo un factor por documento y luego multiplico por la cantidad.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 8 de febrero de 2017 13:20
  • Muchas gracias Williams, 

    Poniéndolo tal y como me dices sale como correcta la vista, pero a la hora de ejecutarla para ver los resultados me da este mensaje:

    Mens. 8134, Nivel 16, Estado 1, Línea 2
    Error de división entre cero.

    Hay veces que un número de documento puede tener cantidades positivas y negativas, de tal forma que su suma da 0. Esto pasa cuando se ha hecho una venta y luego se ha deshecho por lo que sea.

    ¿cómo podría evitar el dividir por 0 cuando 0 es el resultado de la suma, y no directamente ile.quantity?

    Muchas gracias a todos. Se aprende mucho con sus consejos!

    saludos


    jueves, 9 de febrero de 2017 7:52
  • Willams,

    La funcion NULLIF hace lo contrario de lo que planteas. Si el valor es cero entonces devuelve NULL.

    Muchos tendemos a confundirnos con ISNULL.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Nachoju jueves, 9 de febrero de 2017 16:45
    jueves, 9 de febrero de 2017 14:04
  • Nachoju,

    Ponga para atras la funcion NULLIF para evitar ese error de division por cero. Tambien puedes usar una expresion CASE.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Nachoju jueves, 9 de febrero de 2017 16:45
    jueves, 9 de febrero de 2017 14:06
  • Estimado Alejandro, gracias por la observación de hecho las diferencias las tengo claras, sin embargo veo que se me cruzaron los discursos, lamentable!!.

    Nachoju, lamento la observación incorrecta que te dí, la función NULLIF() efectivamente te ayudará a obtener NULL en caso el resultado de la expresión resulte igual al segundo argumento de la función, sin embargo el coste de transporte entre NULL resultará NULL, conviene entonces que conviertas a 0 en caso el resultado de toda la expresión sea NULL.

    COALESCE((PV.CosteTransporte / NULLIF(SUM(ILE.Quantity) 
        OVER (PARTITION by ILE.[Documento]), 0)) * ILE.Quantity, 0)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 9 de febrero de 2017 14:51
  • Estimado Alejandro, gracias por la observación de hecho las diferencias las tengo claras, sin embargo veo que se me cruzaron los discursos, lamentable!!.

    Nachoju, lamento la observación incorrecta que te dí, la función NULLIF() efectivamente te ayudará a obtener NULL en caso el resultado de la expresión resulte igual al segundo argumento de la función, sin embargo el coste de transporte entre NULL resultará NULL, conviene entonces que conviertas a 0 en caso el resultado de toda la expresión sea NULL.

    COALESCE((PV.CosteTransporte / NULLIF(SUM(ILE.Quantity) 
        OVER (PARTITION by ILE.[Documento]), 0)) * ILE.Quantity, 0)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Gracias a todos. Resuelto!
    • Marcado como respuesta Nachoju jueves, 9 de febrero de 2017 16:44
    • Desmarcado como respuesta Joyce_ACModerator jueves, 9 de febrero de 2017 16:49
    jueves, 9 de febrero de 2017 16:44