Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на обобщена таблица с общи стойности на колони и редове в sql сървър 2008

Може да има различни подходи към това. Можете да изчислите всички общи суми след осевата точка или можете първо да получите общите суми, след което да завъртите всички резултати. Възможно е също така да има средно положение:вземете един вид общи суми (напр. тези по редове), завъртете, след това вземете другия вид, въпреки че това може да е прекалено.

Първият от споменатите подходи, получаване на всички суми след осевата точка, може да се направи по много ясен начин и единственото нещо, което е потенциално ново за вас в долната реализация може да бъде 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)
;

По принцип GROUP BY ROLLUP() част създава реда за обща сума за теб. Групирането първо се извършва от environment_name , тогава редът с общата сума се добавя.

За да направите точно обратното, т.е. да получите сумите преди завъртане, можете да използвате GROUP BY CUBE() като това:

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
;

И двата метода могат да бъдат тествани и използвани в SQL Fiddle:

Забележка. Пропуснах стъпката за премахване на завъртането и в двете предложения, защото премахването на завъртането на една колона изглеждаше очевидно излишно. Ако обаче има нещо повече, коригирането на която и да е от заявките трябва да е лесно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете схемата на колоната на SQL таблицата с тип данни и максимална дължина в числова стойност

  2. Шаблон за проектиране за персонализирани полета в релационна база данни

  3. Добавяне на акаунт в база данни за поща към профил (T-SQL)

  4. Use Case Statement в Join

  5. Как да настроите текущия език в SQL Server (T-SQL)