Il existe plusieurs façons de transformer des données de plusieurs lignes en colonnes.
En utilisant PIVOT
Dans SQL Server, vous pouvez utiliser la PIVOT
fonction pour transformer les données des lignes en colonnes:
select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
select value, columnname
from yourtable
) d
pivot
(
max(value)
for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;
Voir la démo .
Pivot avec nombre inconnu de columnnames
Si vous en avez un nombre inconnu columnnames
à transposer, vous pouvez utiliser le SQL dynamique:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName)
from yourtable
group by ColumnName, id
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select value, ColumnName
from yourtable
) x
pivot
(
max(value)
for ColumnName in (' + @cols + N')
) p '
exec sp_executesql @query;
Voir la démo .
Utilisation d'une fonction d'agrégation
Si vous ne souhaitez pas utiliser la PIVOT
fonction, vous pouvez utiliser une fonction d'agrégation avec une CASE
expression:
select
max(case when columnname = 'FirstName' then value end) Firstname,
max(case when columnname = 'Amount' then value end) Amount,
max(case when columnname = 'PostalCode' then value end) PostalCode,
max(case when columnname = 'LastName' then value end) LastName,
max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable
Voir la démo .
Utilisation de jointures multiples
Cela peut également être effectué à l'aide de plusieurs jointures, mais vous aurez besoin d'une colonne pour associer chacune des lignes que vous n'avez pas dans vos exemples de données. Mais la syntaxe de base serait:
select fn.value as FirstName,
a.value as Amount,
pc.value as PostalCode,
ln.value as LastName,
an.value as AccountNumber
from yourtable fn
left join yourtable a
on fn.somecol = a.somecol
and a.columnname = 'Amount'
left join yourtable pc
on fn.somecol = pc.somecol
and pc.columnname = 'PostalCode'
left join yourtable ln
on fn.somecol = ln.somecol
and ln.columnname = 'LastName'
left join yourtable an
on fn.somecol = an.somecol
and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'
cross join
plutôt queleft join
parce que chaque sous-requête renvoie une ligne.C'est plutôt une méthode qu'un simple script, mais vous donne beaucoup plus de flexibilité.
Tout d'abord Il y a 3 objets:
ColumnActionList
] -> contient les données en tant que paramètreproc_PivotPrepare
] -> prépare nos donnéesproc_PivotExecute
] -> exécuter le scriptCREATE TYPE [dbo]. [ColumnActionList] AS TABLE ([ID] [smallint] NOT NULL, [ColumnName] nvarchar NOT NULL, [Action] nchar NOT NULL); ALLER
De l'exécution de la première requête (en passant la base de données source et le nom de la table), vous obtiendrez une requête d'exécution pré-créée pour le deuxième SP, tout ce que vous avez à faire est de définir la colonne de votre source: + Stable + Value (sera utilisé pour concentrer les valeurs en fonction de cela) + Dim (colonne que vous souhaitez utiliser pour pivoter)
Les noms et types de données seront définis automatiquement!
Je ne peux pas le recommander pour tous les environnements de production, mais fait le travail pour les demandes BI ad hoc.
la source
Could not find stored procedure 'dbo.sp_PivotIt'.
Un conseil?sp_Pivot_Execute
passez àproc_PivotExecute
.