Une façon de procéder consiste à utiliser l'agrégation conditionnelle
SELECT name,
MAX(CASE WHEN field = 'Gender' THEN value END) gender,
MAX(CASE WHEN field = 'Age' THEN value END) age
FROM customers
GROUP BY name
L'autre façon (si vous n'êtes intéressé que par ces deux colonnes) serait
SELECT c1.name, c1.value gender, c2.value age
FROM customers c1 JOIN customers c2
ON c1.name = c2.name
AND c1.field = 'Gender'
AND c2.field = 'Age';
L'hypothèse est que le sexe et l'âge existent pour chaque nom. Si ce n'est pas le cas, utilisez un OUTER JOIN
au lieu d'un INNER JOIN
comme ça
SELECT n.name, c1.value gender, c2.value age
FROM
(
SELECT DISTINCT name
FROM customers
) n LEFT JOIN customers c1
ON n.name = c1.name AND c1.field = 'Gender'
LEFT JOIN customers c2
ON n.name = c2.name AND c2.field = 'Age';
Sortie :
| NAME | GENDER | AGE | |--------|--------|-----| | Angela | Female | 28 | | Davis | Male | 30 |
Voici SQLFiddle démo