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.
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