Esiste un modo per trasformare le righe in colonne in MySQL senza utilizzare CASE?
-
28-09-2019 - |
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.
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.