Come trasformare i dati verticali in dati orizzontali con SQL?

Ho una tabella “Articolo” con un numero di elementi correlati, in questo modo:

ID Rel_ID Name RelRank --- ------ ---- ------- 1 1 foo 1 2 1 bar 2 3 1 zam 3 4 2 foo2 1 

Sto cercando di ottenere una query in modo che gli elementi con lo stesso Rel_ID vengano visualizzati nella stessa riga, in questo modo:

 Rel_ID Name1 Name2 Name3 ------ ----- ----- ----- 1 foo bar zam 2 foo2 

Ho provato a selezionare la tabella più volte:

 SELECT k.Rel_ID, k.name 'Name1', k2.name 'Name2' FROM item k, item k2 WHERE k.Rel_ID = k2.Rel_ID 

Ma questo fallisce. Sicuramente c’è una trasformazione o una query che potrebbe semplificare drasticamente il processo, e mi manca solo perché non ho mai usato SQL in questo modo prima. Cosa mi manca?

[Modifica: aggiunta colonna RelRank, che appare nei miei dati]

Indipendentemente dal database che stai utilizzando, il concetto di ciò che stai cercando di ottenere è chiamato “Pivot Table”.

Ecco un esempio per mysql: http://en.wikibooks.org/wiki/MySQL/Pivot_table

Alcuni database hanno funzionalità incorporate per questo, vedere i link qui sotto.

SQLServer: http://msdn.microsoft.com/de-de/library/ms177410.aspx

Oracle: http://www.dba-oracle.com/t_pivot_examples.htm

Puoi sempre creare un pivot a mano. Basta selezionare tutte le aggregazioni in un set di risultati e quindi selezionare da quel set di risultati. Nota, nel tuo caso, puoi mettere tutti i nomi in una colonna usando concat (penso che sia group_concat in mysql), dato che non puoi sapere quanti nomi sono legati ad aa rel_id.

pseudo-select per il tuo caso (non so mysql):

 select rel_id, group_concat(name) from item group by rel_id 

Penso che tu stia cercando una risposta specifica per mysql. Tieni presente che la syntax potrebbe variare tra diversi archivi di dati.

MySQL ha una funzione che rende questo facile.

 SELECT Rel_ID, GROUP_CONCAT(Name SEPARATOR ' ') As Names FROM Item GROUP BY Rel_ID; 

dovrebbe funzionare 🙂

se i nomi che hai elencato sono statici, la mia query di sotto che ho eseguito con successo in sqlfiddle funzionerà

 SELECT rel_id, MAX (DECODE (rel_id, '1', DECODE (relrank, '1', name) , '2',DECODE (relrank, '1', name))) NAME1, MAX (DECODE (rel_id, '1', DECODE (relrank, '2', name))) NAME2, MAX (DECODE (rel_id, '1', DECODE (relrank, '3', name))) NAME3 FROM supportContacts GROUP BY rel_id 

ecco il violino SQL

http://sqlfiddle.com/#!4/480e2/11