web-dev-qa-db-fra.com

SQL Server débloquer plusieurs colonnes

J'essaie de faire pivoter un tableau autour de ses nombreuses colonnes pour arriver à 3 colonnes (pivot, nom de colonne, valeur)

donc par exemple:

name  |  age  |  gender
------+-------+---------
John  |   20  |    M
Jill  |   21  |    F

deviendrait:

name | column | value
-----+--------+-------
John |  age   |   20
John | gender |   M
Jill |  age   |   21
Jill | gender |   F

J'ai googlé un peu, mais je n'ai pas trouvé de situation similaire - d'autant plus que le pivot semble se faire dans la direction opposée à ce que j'essaie d'accomplir.

14
mathematician

La conversion des colonnes en lignes s'appelle un UNPIVOT. Vous n'avez pas spécifié la version de SQL Server que vous utilisez, mais il existe plusieurs façons d'obtenir le résultat.

Vous pouvez utiliser SELECT avec UNION ALL:

SELECT name, 'age' as column, cast(age as varchar(10)) as value
FROM yourtable
UNION ALL
SELECT name, 'gender' as column, gender as value
FROM yourtable;

Si vous utilisez SQL Server 2005+, vous pouvez utiliser la fonction UNPIVOT:

SELECT name, column, age
FROM
(
  SELECT 
    name, 
    age = cast(age as varchar(10)), 
    gender
  FROM yourtable
) d
UNPIVOT
(
  value
  for column in (age, gender)
) unpiv;

Enfin, au lieu de la fonction UNPIVOT, vous pouvez également utiliser CROSS APPLY avec VALUES (2008+) ou UNION ALL:

SELECT name, column, age
FROM yourtable
CROSS APPLY
(
  VALUES
    ('age', cast(age as varchar(10)),
    ('gender', gender)
) c (column, value);

Chacune de ces versions vous donnera le résultat que vous souhaitez. Vous remarquerez que j'ai dû transtyper la colonne age en varchar. Cela est dû au fait que le type de données/la longueur (en unpivot) des colonnes doit être le même puisque vous les transformerez en une seule colonne dans le résultat final.

26
Taryn
SELECT name, column, value
FROM (SELECT name, age, gender
FROM table) src
UNPIVOT (value FOR column IN (age, gender)) pvt
0
L Vermeulen