Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL transpõe tabela completa


Para transpor os dados para o resultado que você deseja, você precisará usar tanto o UNPIVOT e o PIVOT funções.

O UNPIVOT função recebe o A e B colunas e converte os resultados em linhas. Então você usará o PIVOT função para transformar o day valores em colunas:
select *
from
(
  select day, col, value
  from yourtable
  unpivot
  (
    value
    for col in (A, B)
  ) unpiv
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

Consulte SQL Fiddle com demonstração.

Se você estiver usando o SQL Server 2008+, poderá usar CROSS APPLY com VALUES para desarticular os dados. Seu código seria alterado para o seguinte:
select *
from
(
  select day, col, value
  from yourtable
  cross apply
  (
    values ('A', A),('B', B)
  ) c (col, value)
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

Consulte SQL Fiddle com demonstração.

Edite #1, aplicando sua consulta atual na solução acima, você usará algo semelhante a isto:
select *
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek,
    col, 
    value
  from DataTable 
  cross apply 
  (
    values ('A', ACalls), ('B', BCalls)
  ) c (col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv