sql >> Databasteknik >  >> RDS >> Sqlserver

Använder pivottabell med kolumn- och radsummor i sql server 2008

Det kan finnas olika tillvägagångssätt för detta. Du kan beräkna alla summor efter pivoten, eller så kan du få totalerna först och sedan pivotera alla resultat. Det är också möjligt att ha en typ av medelväg:få en sorts totalsummor (t.ex. de radvisa), pivotera och sedan den andra sorten, även om det kan vara överdrivet.

Det första av de nämnda tillvägagångssätten, att få alla summor efter pivoten, skulle kunna göras på ett mycket enkelt sätt, och det enda potentiellt nya för dig i implementeringen nedan kan vara 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)
;

I grund och botten är GROUP BY ROLLUP() del producerar Total raden till dig. Grupperingen görs först av environment_name , sedan läggs den totala raden till.

För att göra precis tvärtom, dvs få totalsummorna före pivotering, kan du använda GROUP BY CUBE() så här:

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
;

Båda metoderna kan testas och spelas med på SQL Fiddle:

Obs. Jag har utelämnat opivoteringsteget i båda förslagen eftersom det verkade klart överflödigt att avpivotera en enda kolumn. Men om det finns mer i det bör det vara enkelt att justera någon av frågorna.



  1. Radnummer per grupp i mysql

  2. Hur kan jag enkelt analysera ett Oracle-pakets exekvering för prestandaproblem?

  3. Misslyckas med produktion/heroku:WHERE a.attrelid ='skolor'::regklass

  4. Är det möjligt att svämma över en Oracle NUMBER-typ?