Mysql
 sql >> Database >  >> RDS >> Mysql

C'è un modo per trasformare le righe in colonne in MySQL senza usare CASE?

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

Per prima cosa dichiara 3 variabili per costruire questo... Andrò con @select, @join e @sql per questo esempio. Assegna 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. Userò @field mentre la variabile viene popolata con il campo table.key distinto. Quindi scorrelo costruendo le due variabili:

 set @select = @select + ', ' + @field + '.value as '[email protected]+'
 set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.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

SQL dinamico costruito in questo modo può essere un vero problema per risolvere i problemi (e correggere) 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 lì, le variabili diventano troppo grandi. Mi dispiace non posso essere più preciso con lo pseudo su questo... scoprirai che la creazione di sql dinamico in sql è scrupolosa.