Domanda

Ci sono molti post là fuori su come trasformare le righe in colonne per vari database.Sembrano ricadere in due campi, utilizzando dichiarazioni di casi o utilizzando una funzione incorporata del fornitore del database.sto usando MySQL e finora non ho trovato nulla su nessuna funzione integrata che mi permetta di ruotare su un numero arbitrario sconosciuto di valori di riga che voglio ruotare in colonne.Se non conosco i valori in anticipo, non posso creare le query CASE che appaiono frequentemente su StackOverflow.Voglio sapere se c'è qualcosa in MySQL simile a questi in altri database dove si chiama tabella incrociata o pivot:

-PostgreSQL: http://www.postgresql.org/docs/current/static/tablefunc.html
-Oracolo: http://www.oracle-base.com/articles/11g/PivotAndUnpivotOperators_11gR1.php
-Server SQL: http://msdn.microsoft.com/en-us/library/ms177410.aspx

Giusto per assicurarmi di avere chiaro cosa chiedo quando dico di trasformare le righe in colonne, voglio trasformare una tabella come questa

user_id      chiave       valore
caschetto            capelli        castano
Bob Eyes Blue
Jake            capelli        castani
Jake Height 6'2 "

In questo:

user_id      capelli       occhi       altezza
Bob Brown Blue
Jake Brown 6'2 "

Sto cercando specificamente una soluzione in MySQL, quindi se c'è qualcosa di specifico del database che è nuovo o che sta uscendo di cui sei a conoscenza e che può risolvere questo problema, sarebbe molto apprezzato.

È stato utile?

Soluzione

Il collegamento fornito da Kangkan ti mostrerà come eseguire questa operazione se avessi conosciuto in anticipo i nomi delle colonne.Utilizzeremo la stessa logica, tranne l'utilizzo di SQL dinamico per creare l'istruzione.Ci sono 2 parti per ciascun campo che devi includere, il campo nell'istruzione select e un join appropriato per ottenere il valore... quindi dovremo creare l'istruzione in due parti

Per prima cosa dichiara 3 variabili per costruire questo... per questo esempio utilizzerò @select, @join e @sql.Dai alle variabili i valori iniziali

 set @select = 'select user_id,'
 set @join = 'from table t'

ora dichiara e carica un cursore con i valori distinti nel campo table.key.Utilizzerò @field poiché la variabile viene popolata con il campo table.key distinto.Quindi esegui il loop costruendo le due variabili:

 set @select = @select + ', ' + @field + '.value as '+@field+'
 set @join = @join + ' left join table ' + @field + 'on '+@field+'.key = t.key and and '+@field+'.user_id = t.user_id

(il join è progettato per utilizzare il valore in @field come alias della tabella)

scorrere il cursore costruendo @select e @join.Alla fine del ciclo:

set @sql = @select + @join + 'where clause if you want'
exec @sql

L'SQL dinamico costruito in questo modo può essere un vero problema per risolvere i problemi (e risolverli) e aprire problemi di sicurezza... ma è l'unico modo in cui posso vederlo realizzato.Fai attenzione alle restrizioni sulle dimensioni delle tue variabili.... se hai troppe chiavi distinte, le variabili diventano troppo grandi.Mi dispiace, non posso essere più esatto con lo pseudo su questo... scoprirai che costruire SQL dinamico in SQL è meticoloso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top