sql >> Databáze >  >> RDS >> Sqlserver

SQL transponuje celou tabulku

Abyste mohli data převést do požadovaného výsledku, budete muset použít oba UNPIVOT a PIVOT funkce.

UNPIVOT funkce přebírá A a B sloupce a převede výsledky na řádky. Poté použijete PIVOT funkce pro transformaci day hodnoty do sloupců:

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

Viz SQL Fiddle with Demo.

Pokud používáte SQL Server 2008+, můžete použít CROSS APPLY s VALUES pro odklopení dat. Váš kód by se změnil na následující:

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

Viz SQL Fiddle with Demo.

Upravte #1, když použijete svůj aktuální dotaz na výše uvedené řešení, použijete něco podobného:

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



  1. Porovnejte prováděcí plány na serveru SQL Server

  2. Příklady POWER() v SQL Server

  3. Databázová tabulka Android SQLite se nevytváří

  4. Ovladač nemohl navázat zabezpečené připojení k serveru SQL Server pomocí šifrování Secure Sockets Layer (SSL).