usar tables query examples como columns sql mysql database pivot

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