none
Como crear una columna orden en una tabla + una fila TOTAL en ultima fila de la tabla RRS feed

  • Pregunta

  • Hola,

    Trabajo con SQL Server y me encuentro con el siguiente problema:

    Tengo una tabla sobre la cual necesito crear una columna orden ascendente en funcion del mes y año indicado en cada fila. Igualmente necesito añadir una fila TOTAl al final de la misma donde suma el valor del campo ventas del resto de filas.

    DECLARE @Ventas AS TABLE
    (
       NumeroMes  Int ,
       Año Int,
       ImporteVenta decimal(15,5)
       
    )
    
    ;
    
    INSERT INTO @Ventas
    VALUES(1,2011,24.5),
     (2,2011,25.5),
     (3,2012,14),
     (6,2012,1.5),
     (7,2012,32.5),
     (8,2012,11.5),
     (9,2012,9.24),
     (1,2013,8.74),
     (2,2013,22.5),
     (3,2013,11.4),
     (4,2013,6.5);
    
    
     Select 
    
    CASE WHEN (GROUPING (NumeroMes,Año) = 1) THEN (COUNT(*) OVER()) + 1 ELSE ROW_NUMBER() OVER(ORDER BY NumeroMes,Año DESC)-1 END AS Orden,   
     CASE 
      WHEN (GROUPING((NumeroMes,Año)) = 1) THEN NULL
      ELSE MAX((NumeroMes,Año))
     END AS ID,
     CASE 
      WHEN (GROUPING(NumeroMes,Año) = 1) THEN 'TOTAL' 
      ELSE NumeroMes,Año  
     END AS NumeroMes,Año
     , SUMVentas AS Ventas,
    * from @Ventas
    GROUP BY 
     ROLLUP(NumeroMes,Año)NumeroMes,Año

    A modo de ejemplo busco obtener el siguiente resultado:

    He probado con este script pero recibo el error:

    La función GROUPING requiere al menos 1 argumentos.

    ¿se os ocurre donde puede estar el error?

    Muchas gracias

    Angel



    • Editado Angeleci miércoles, 9 de noviembre de 2016 12:42
    miércoles, 9 de noviembre de 2016 12:22

Respuestas

  • La funcion GROUPING solo admite un argumento. Es decir, puedes poner GROUPING(NumeroMes) o GROUPING(Año), pero no GROUPING(NumeroMes,Año). Si quieres saber si una linea esta agrupada por los dos valores puedes hacer esto:

    GROUPING(NumeroMes)=1 AND GROUPING(Año)=1

    • Marcado como respuesta Angeleci jueves, 10 de noviembre de 2016 21:19
    miércoles, 9 de noviembre de 2016 14:05