Buenos días jursco:
Se me ocurre que puedes hacer algo como lo siguiente:
Código MySQL:
Ver original#Creamos una tabla de prueba
#Insertamos los valores de prueba
insert into Tabla_Prueba
values ('a1'), ('a2'),('a3'),('a4'),('a5'),('a6'),('a7'),('a8'),('a9'),('a10'),('a11'),('a12');
#Verificamos cómo se muestran los datos con un select normal
#'Dividimos' la columna en tres columnas y mostramos la consulta
(
SELECT @rownum
:=@rownum
+1 idRenglon
, columna
(
SELECT @rownum2
:=@rownum2
+1 idRenglon
, columna
) T2
ON T1.idRenglon
= T2.idRenglon
(
SELECT @rownum3
:=@rownum3
+1 idRenglon
, columna
)T3
ON T1.idRenglon
= T3.idRenglon
;
#Borramos la tabla que creamos de ejemplo
Lo que hace la consulta es seleccionar cada columna como una tabla, y asignarles un idRenglon, de tal manera que puedas hacer un INNER JOIN, es decir, las subconsultas te regresan algo como esto:
Código:
T1
idRenglon|Columna
-------------------------
1|a1
2|a2
3|a3
4|a4
T2
idRenglon|Columna
-------------------------
1|a5
2|a6
3|a7
4|a8
T3
idRenglon|Columna
-------------------------
1|a9
2|a10
3|a11
4|a12
Por lo tanto la salida queda de esta manera:
Código:
Col1|Col2|Col3
----------------------------
a1|a5|a9
a2|a6|a10
a3|a7|a11
a4|a8|a12
Como vez no hace falta utilizar ningún procedimiento almacenado y sólo estoy utilizando código SQL. Si quisieras más columnas se deberían hacer más subconsultas y para manejar el número de renglones a mostrar pues sería cuestión de cambiar los valores del LIMIT.
Como dices que manejas millones de registros no sé que tan conveniente sea hacer esto, es cuestión que lo pruebes y nos comentes. Puede ser que la consulta no sea la más óptima, pero fue lo primero que se me ocurrió.
Saludos
Leo.
------------------------------------
El ignorante afirma, el sabio duda y reflexiona
Aristóteles