Cela se fait avec un tableau croisé dynamique . Regroupement par id
, vous émettez CASE
instructions pour chaque valeur que vous souhaitez capturer dans une colonne et utilisez quelque chose comme un MAX()
agréger pour éliminer les valeurs nulles et réduire à une seule ligne.
SELECT
id,
/* if col1 matches the name string of this CASE, return col2, otherwise return NULL */
/* Then, the outer MAX() aggregate will eliminate all NULLs and collapse it down to one row per id */
MAX(CASE WHEN (col1 = 'name') THEN col2 ELSE NULL END) AS name,
MAX(CASE WHEN (col1 = 'name2') THEN col2 ELSE NULL END) AS name2,
MAX(CASE WHEN (col1 = 'name3') THEN col2 ELSE NULL END) AS name3
FROM
yourtable
GROUP BY id
ORDER BY id
Voici un exemple fonctionnel
Remarque :Cela ne fonctionne tel quel que pour un nombre fini et connu de valeurs possibles pour col1
. Si le nombre de valeurs possibles est inconnu, vous devez créer l'instruction SQL dynamiquement dans une boucle.