web-dev-qa-db-fra.com

Table complète de transposition SQL

J'ai besoin de faire la transposition suivante dans MS SQL

de:

Day  A  B 
---------
Mon  1  2
Tue  3  4
Wed  5  6
Thu  7  8
Fri  9  0

Aux éléments suivants:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0

Je comprends comment le faire avec PIVOT quand il n'y a qu'une seule colonne (A) mais je ne sais pas comment le faire quand il y a plusieurs colonnes à transposer (A, B, ...)

Exemple de code à transposer:

select LEFT(datename(dw,datetime),3) as DateWeek, 
  sum(ACalls) as A, 
  Sum(BCalls) as B 
from DataTable
group by LEFT(datename(dw,datetime),3)

Structure de la table:

Column DataType
DateTime Datetime
ACalls int
BCalls int

Toute aide sera très appréciée.

18
Selrac

Pour transposer les données dans le résultat souhaité, vous devrez utiliser à la fois les fonctions UNPIVOT et PIVOT .

La fonction UNPIVOT prend les colonnes A et B et convertit les résultats en lignes. Ensuite, vous utiliserez la fonction PIVOT pour transformer les valeurs day en colonnes:

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

Voir SQL Fiddle with Demo .

Si vous utilisez SQL Server 2008+, vous pouvez utiliser CROSS APPLY avec VALUES pour annuler le pivotement des données. Votre code serait modifié comme suit:

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

Voir SQL Fiddle with Demo .

Modifier # 1, en appliquant votre requête actuelle dans la solution ci-dessus, vous utiliserez quelque chose de similaire à ceci:

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
26
Taryn