Pregunta

Estoy tratando de reordenar / agrupar un conjunto de resultados usando SQL. Tengo algunos campos (que, por ejemplo, han cambiado de nombre a algo un poco menos específico), y cada grupo lógico de registros tiene un campo que permanece constante: el campo de dirección. También hay campos que están presentes para cada dirección, estos son los mismos para cada dirección.

id  forename    surname     address
1   John        These       Address1
2   Lucy        Values      Address1
3   Jenny       Are         Address1
4   John        All         Address2
5   Lucy        Totally     Address2
6   Jenny       Different   Address2
7   Steve       And         Address2
8   Richard     Blah        Address2

address     John    Lucy            Jenny       Steve       Richard
Address1        These   Values          Are         (null)      (null)
Address2        All     Totally         Different   And         Blah

Por ejemplo: John, Lucy, Jenny, Steve y Richard son los únicos nombres posibles en cada dirección. Lo sé porque está almacenado en otra ubicación.

¿Puedo seleccionar valores de los registros reales en la imagen de la izquierda y devolverlos como un conjunto de resultados como el de la derecha? Estoy usando MySQL si eso hace la diferencia.

¿Fue útil?

Solución

Suponiendo que los encabezados de columna "John", "Lucy" etc son fijos, puede agrupar por el campo de dirección y usar las funciones if () combinadas con operadores agregados para obtener sus resultados:

select max(if(forename='john',surname,null)) as john,
       max(if(forename='lucy',surname,null)) as lucy,
       max(if(forename='jenny',surname,null)) as jenny,       
       max(if(forename='steve',surname,null)) as steve,       
       max(if(forename='richard',surname,null)) as richard,
       address
from tablename 
group by address;

Sin embargo, es un poco frágil.

También existe la función group_concat que se puede usar (dentro de los límites) para hacer algo similar, pero se ordenará en filas en lugar de en columnas como parece que se requiere.

ej.

select address, group_concat( concat( forename, surname ) ) tenants 
from tablename
group by address;

Otros consejos

No estoy seguro, pero creo que lo que estás intentando hacer es GROUP BY.

SELECT Address,Name FROM Table GROUP BY Name

si desea seleccionar más columnas, asegúrese de que estén incluidas en la cláusula GROUP BY. Además, ahora puede hacer funciones agregadas, como MAX () o COUNT ().

No estoy seguro acerca de la pregunta, pero por lo que entiendo que puedes hacer:

SELECT concat(column1,column2,column3) as main_column, address from table;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top