sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-transponera hela tabellen

För att överföra data till det resultat du vill ha, måste du använda både UNPIVOT och PIVOT funktioner.

UNPIVOT funktionen tar A och B kolumner och konverterar resultaten till rader. Då kommer du att använda PIVOT funktion för att omvandla day värden i kolumner:

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

Se SQL Fiddle with Demo.

Om du använder SQL Server 2008+ kan du använda CROSS APPLY med VALUES för att avpivotera data. Din kod skulle ändras till följande:

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

Se SQL Fiddle with Demo.

Redigera #1, genom att tillämpa din nuvarande fråga i ovanstående lösning kommer du att använda något liknande detta:

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. Så här fixar du "Partitionsschemat '...' har ingen nästa använda filgrupp" i SQL Server

  2. Prestandaöverväganden för temporär data i Oracle

  3. Vad är en en-till-en relation i en databas?

  4. Hur TIMESTAMPADD() fungerar i MariaDB