sql >> Base de Datos >  >> RDS >> Sqlserver

Usando una tabla dinámica con totales de columnas y filas en el servidor sql 2008

Puede haber varios enfoques para esto. Puede calcular todos los totales después del pivote, o puede obtener los totales primero y luego pivotar todos los resultados. También es posible tener una especie de término medio:obtener un tipo de totales (por ejemplo, los totales por fila), pivotar y luego obtener el otro tipo, aunque eso podría ser exagerar.

El primero de los enfoques mencionados, obtener todos los totales después del pivote, podría hacerse de una manera muy sencilla, y lo único potencialmente nuevo para usted en la siguiente implementación podría ser GROUP BY ROLLUP() :

SELECT
  [ ]      = ISNULL(environment_name, 'Total'),
  [Enviro] = SUM([Enviro]),
  [Requi]  = SUM([Requi]),
  [Dev]    = SUM([Dev]),
  [Tsc]    = SUM([Tsc]),
  [TD]     = SUM([TD]),
  [Unkn]   = SUM([Unkn]),
  Total    = SUM([Enviro] + [Requi] + [Dev] + [Tsc] + [TD] + [Unkn])
FROM (
  SELECT environment_name, root_cause
  FROM test1
) s
PIVOT (
  COUNT(root_cause)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn])
) p
GROUP BY
  ROLLUP(environment_name)
;

Básicamente, el GROUP BY ROLLUP() parte produce la fila Total para ti. La agrupación la realiza primero environment_name , luego se agrega la fila del total general.

Para hacer exactamente lo contrario, es decir, obtener los totales antes de pivotar, podría emplear GROUP BY CUBE() así:

SELECT
  [ ]      = environment_name,
  [Enviro] = ISNULL([Enviro], 0),
  [Requi]  = ISNULL([Requi] , 0),
  [Dev]    = ISNULL([Dev]   , 0),
  [Tsc]    = ISNULL([Tsc]   , 0),
  [TD]     = ISNULL([TD]    , 0),
  [Unkn]   = ISNULL([Unkn]  , 0),
  Total    = ISNULL(Total   , 0)
FROM (
  SELECT
    environment_name = ISNULL(environment_name, 'Total'),
    root_cause       = ISNULL(root_cause,       'Total'),
    cnt              = COUNT(*)
  FROM test1
  WHERE root_cause IS NOT NULL
  GROUP BY
    CUBE(environment_name, root_cause)
) s
PIVOT (
  SUM(cnt)
  FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn], Total)
) p
;

Ambos métodos se pueden probar y jugar con SQL Fiddle:

Nota. He omitido el paso de no pivotar en ambas sugerencias porque quitar el pivote de una sola columna parecía claramente redundante. Sin embargo, si hay algo más, ajustar cualquiera de las consultas debería ser fácil.