examples - pivot tables mysql query
SQL-¿Cómo transponer? (2)
Tengo algo similar a la siguiente tabla:
================================================
| Id | UserId | FieldName | FieldValue |
=====+========+===============+================|
| 1 | 100 | Username | John Doe |
|----+--------+---------------+----------------|
| 2 | 100 | Password | pass123! |
|----+--------+---------------+----------------|
| 3 | 102 | Username | Jane |
|----+--------+---------------+----------------|
| 4 | 102 | Password | $ecret |
|----+--------+---------------+----------------|
| 5 | 102 | Email Address | [email protected] |
------------------------------------------------
Necesito una consulta que me dé un resultado como este:
==================================================
| UserId | Username | Password | Email Address |
=========+===========+===========================|
| 100 | John Doe | pass123! | |
|--------+-----------+----------+----------------|
| 102 | Jane | $ecret | [email protected] |
|--------+-----------+----------+----------------|
Tenga en cuenta que los valores en FieldName no están limitados a Nombre de usuario, Contraseña y Dirección de correo electrónico. Pueden ser cualquier cosa como sean definidas por el usuario.
¿Hay alguna manera de hacer esto en SQL?
MySQL no admite la sintaxis ANSI PIVOT / UNPIVOT, por lo que le dejamos usar:
SELECT t.userid
MAX(CASE WHEN t.fieldname = ''Username'' THEN t.fieldvalue ELSE NULL END) AS Username,
MAX(CASE WHEN t.fieldname = ''Password'' THEN t.fieldvalue ELSE NULL END) AS Password,
MAX(CASE WHEN t.fieldname = ''Email Address'' THEN t.fieldvalue ELSE NULL END) AS Email
FROM TABLE t
GROUP BY t.userid
Como puede ver, las declaraciones CASE deben definirse por valor. Para hacer esto dinámico, necesitaría usar la sintaxis de declaración preparada (SQL dinámico) de MySQL .
Podrías usar GROUP_CONCAT
(no probado)
SELECT UserId,
GROUP_CONCAT( if( fieldname = ''Username'', fieldvalue, NULL ) ) AS ''Username'',
GROUP_CONCAT( if( fieldname = ''Password'', fieldvalue, NULL ) ) AS ''Password'',
GROUP_CONCAT( if( fieldname = ''Email Address'', fieldvalue, NULL ) ) AS ''Email Address'',
FROM table
GROUP BY UserId