¿Puede una consulta MySQL convertir filas en columnas?

Tengo varias tablas que bash combinar con combinaciones, pero como tal, los resultados se devuelven en varias filas, mientras que me gustaría que se generaran como columnas nuevas.

Tabla de información del miembro

MemberID | FirstName | LastName --------------------------------- 1 | John | Harris 2 | Sarah | Thompson 3 | Zack | Lewis 

member_dependent_information Table

 MemberID | FirstName | LastName | Type --------------------------------------- 1 | Amy | Harris | 1 2 | Bryan | Thompson | 1 2 | Dewey | Thompson | 2 2 | Tom | Thompson | 2 3 | Harry | Lewis | 2 3 | Minka | Lewis | 1 

Consulta MySQL:

 SELECT t1.FirstName, t1.LastName, t1.MemberID, IF(t2.Type = '1',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Spouse_Name, IF(t2.Type = '2',CONCAT(t2.FirstName,' ',t2.LastName),'') AS Child_Name, FROM member_dependent_information t2 INNER JOIN member_information t1 USING (MemberID) ORDER BY t1.LastName ASC, t1.MemberID ASC; 

Resultados ideales

 MemberID | FirstName | LastName | Spouse_Name | Child_Name1 | Child_Name2 -------------------------------------------------------------------------------- 1 | John | Harris | Amy Harris | NULL | NULL 2 | Sarah | Thompson | Bryan Thompson | Dewey Thompson | Tom Thompson 3 | Zack | Lewis | Mika Lewis | Harry Lewis | NULL 

RESULTADOS ACTUALES

 MemberID | FirstName | LastName | Spouse_Name | Child_Name ------------------------------------------------------------------- 1 | John | Harris | Amy Harris | NULL 2 | Sarah | Thompson | Bryan Thompson | NULL 2 | Sarah | Thompson | NULL | Dewey Thompson 2 | Sarah | Thompson | NULL | Tom Thompson 3 | Zack | Lewis | Mika Lewis | NULL 3 | Zack | Lewis | NULL | Harry Lewis 

Si bien mi consulta devuelve los datos “correctos” en varias filas, no combina el resultado en una sola fila, según sea necesario.

La sugerencia de Tablas pivote / Tablas cruzadas se ha mencionado a continuación, pero cada referencia que puedo encontrar sugiere el uso de cálculos matemáticos o que se conoce el número de campos que se deben devolver. No sabré esta información porque un solo miembro PODRÍA tener hasta 100 dependientes (aunque más como 4-8)

ACTUALIZACIÓN # 1

Siento que me estoy acercando a la solución final. Agregué la función GROUP_CONCAT a mi consulta, que devuelve TODOS los nombres en una sola columna y TODOS los apellidos en una sola columna, pero aún es necesario dividirlos en sus propias columnas individuales.

Nueva función es:

 SELECT t1.MemberID, t1.FirstName, t1.LastName, GROUP_CONCAT(t2.FirstName) AS Dep_Firstnames, GROUP_CONCAT(t2.LastName) AS Dep_LastNames FROM member_information t1 LEFT OUTER JOIN member_dependent_information t2 ON t1.MemberID = t2.MemberID WHERE t1.Status = 1 GROUP BY t1.MemberID 

Algunas veces, el primer paso para resolver su problema es saber cómo se llama. Después de eso, es simplemente una cuestión de googlear. Lo que intenta crear se llama tabla dinámica o informe de tabla cruzada . Aquí hay un enlace que explica cómo crear tablas dinámicas en MySQL . Y aquí hay un tutorial más en profundidad.

ACTUALIZAR:

Ahora que ha actualizado la pregunta, tengo una idea más clara de lo que está tratando de lograr. Le daré una solución alternativa que es similar pero no exactamente lo que usted quiere basado en la función GROUP_CONCAT de MySQL.

 select t1.FirstName, t1.LastName, group_concat(concat(t2.FirstName, ' ', t2.LastName)) from member_information as t1 left outer join member_dependent_information as t2 on t2.MemberID=t1.MemberID group by t1.MemberID; 

He verificado esta consulta de la siguiente manera. Primero la configuración:

 create table member_information ( MemberID int unsigned auto_increment primary key, FirstName varchar(32) not null, LastName varchar(32) not null ) engine=innodb; create table member_dependent_information ( MemberID int unsigned not null, FirstName varchar(32) not null, LastName varchar(32) not null, Type int unsigned not null, foreign key (MemberID) references member_information(MemberID) ) engine=innodb; insert into member_information (MemberID, FirstName, LastName) values (1, 'John', 'Harris'), (2, 'Sarah', 'Thompson'), (3, 'Zack', 'Lewis'); insert into member_dependent_information (MemberID, FirstName, LastName, `Type`) values (1, 'Amy', 'Harris', 1), (2, 'Bryan', 'Thompson', 1), (2, 'Dewey', 'Thompson', 2), (2, 'Tom', 'Thompson', 2), (3, 'Harry', 'Lewis', 2), (3, 'Minka', 'Lewis', 1); 

Y ahora la consulta y los resultados:

 mysql> select t1.FirstName, t1.LastName, group_concat(concat(t2.FirstName, ' ', t2.LastName))from member_information as t1 -> left outer join member_dependent_information as t2 on t2.MemberID=t1.MemberID -> group by t1.MemberID; +-----------+----------+------------------------------------------------------+ | FirstName | LastName | group_concat(concat(t2.FirstName, ' ', t2.LastName)) | +-----------+----------+------------------------------------------------------+ | John | Harris | Amy Harris | | Sarah | Thompson | Bryan Thompson,Dewey Thompson,Tom Thompson | | Zack | Lewis | Harry Lewis,Minka Lewis | +-----------+----------+------------------------------------------------------+ 3 rows in set (0.00 sec) 

No estoy seguro de cómo el OP programID tener programID y Status a cómo está ahora, pero lo más cercano que podría obtener es (que no requiere tablas dinámicas):

 SELECT t1.MemberID, t1.FirstName, t1.LastName, concat(t2.FirstName, ' ', t2.LastName) as Spouse_Name, group_concat(concat(t3.FirstName, ' ', t3.LastName) ORDER BY t3.FirstName) as Children_names FROM member_information t1 LEFT JOIN member_dependent_information t2 ON (t1.MemberID=t2.MemberID AND t2.Type=1) LEFT JOIN member_dependent_information t3 ON (t1.MemberID=t3.MemberID and t3.Type=2) GROUP BY MemberID; 

Que produce:

  + ---------- + ----------- + ---------- + --------------- - + ----------------------------- +
 |  MemberID |  Nombre |  Apellido |  Spouse_Name |  Niños_nombres |
 + ---------- + ----------- + ---------- + --------------- - + ----------------------------- +
 |  1 |  John |  Harris |  Amy Harris |  NULL |
 |  2 |  Sarah |  Thompson |  Bryan Thompson |  Dewey Thompson, Tom Thompson |
 |  3 |  Zack |  Lewis |  Minka Lewis |  Harry Lewis |
 + ---------- + ----------- + ---------- + --------------- - + ----------------------------- + 

y sería “fácil” con cualquier lenguaje de progtwigción extraer ese Children_names en columnas separadas.

Esto no es exactamente lo que está buscando, pero podría ser un paso en la dirección correcta.

 SELECT Table1.memberIDs, Table1.firstname, Table1.lastnames, Table2.programIDs, Table3.description FROM Table1, Table2, Table3 WHERE Table1.memberIDs = Table2.memberIDs AND Table2.programIDs = Table3.programID