Juste pour développer les autres réponses, la fonction PIVOT nécessite un certain type d'agrégation. Étant donné que la valeur que vous souhaitez convertir d'une ligne en une colonne est une chaîne, vous êtes limité à utiliser soit le max()
ou min()
fonction d'agrégation.
Alors que @Muhammed Ali's
la réponse fonctionnera lorsque vous avez un seul AttributeName
/AttributeValue
paire, si vous avez plusieurs paires pour chaque ID
, alors vous ne renverrez que le max
ou min
évaluer.
Par exemple, si votre exemple de données est :
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');
Même si vous avez plusieurs lignes pour la combinaison de A1
et Atr1
, les autres requêtes ne renvoient que le max(attributevalue)
:
| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |
Je suppose que vous voudriez réellement retourner toutes les combinaisons. Je suggère d'élargir votre requête pour inclure la fonction de fenêtrage, row_number()
dans votre requête. Cette requête génère une valeur unique qui sera ensuite incluse dans l'aspect regroupement du PIVOT et vous permettra de renvoyer plus d'une ligne pour chaque ID.
En ajoutant le row_number()
, la requête ressemblera à ce qui suit :
SELECT Id, [Atr1], [Atr2],[Atr3]
FROM
(
SELECT ID, AttributeName, AttributeValue,
row_number() over(partition by id, attributename
order by attributevalue) seq
FROM @MyTable
) AS SourceTable
PIVOT
(
max(AttributeValue)
FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
) AS pvt
order by id;
Voir SQL Fiddle avec démo . Vous obtiendrez un résultat qui renvoie toutes les lignes :
| ID | ATR1 | ATR2 | ATR3 |
|----|------|--------|--------|
| A1 | A1V1 | A1V2 | A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 | A2V2 | A3V3 |
Si vous rencontrez des difficultés pour saisir le concept de PIVOT, je vous suggérerais d'utiliser une combinaison d'une fonction d'agrégation avec une expression CASE pour obtenir le résultat. Vous pouvez alors voir le regroupement de la séquence/id :
SELECT Id,
max(case when attributename = 'Atr1' then attributevalue end) Atr1,
max(case when attributename = 'Atr2' then attributevalue end) Atr2,
max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
(
SELECT ID, AttributeName, AttributeValue,
row_number() over(partition by id, attributename
order by attributevalue) seq
FROM @MyTable
) AS SourceTable
group by id, seq
Voir SQL Fiddle avec démo