MySQL - Unir columnas en una en SQL

   
Vista:

Unir columnas en una en SQL

Publicado por Irati (5 intervenciones) el 10/04/2017 16:01:02
Hola,

Tengo una base de datos donde tengo una tabla que contiene tres variables distintas (var1,var2,var3) con sus distintos valores.


var1 | var2 | var3
----------------------
1 2 3
4 5 6
7 8 9


La cuestión es, que quiero dibujar un solo grafico con dichos valores, y necesito indicar esto mediante SQL poniendo todos los datos en orden en una sola columna, es decir, 1-2-3-4-5-6-7-8-9

Podría ayudarme alguien? no se ni si es viable hacer algo así con consultas o vistas SQL.
.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Unir columnas en una en SQL

Publicado por leonardo_josue (307 intervenciones) el 10/04/2017 23:26:19
Hola Irati;

Hay varias formas de hacer lo que quieres, la más sencilla sería utilizar las funciones de CADENA GROUP_CONCAT y CONCAT_WS... si tienes dudas de cómo funcionan investiga un poco en la documentación oficial de MySQL, sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tu_tabla;
+------+------+------+
| var1 | var2 | var3 |
+------+------+------+
|    1 |    2 |    3 |
|    4 |    5 |    6 |
|    7 |    8 |    9 |
+------+------+------+
3 rows in set (0.00 sec)
 
mysql> SELECT
    ->   GROUP_CONCAT(CONCAT_WS(',', var1, var2, var3)) campo
    -> FROM tu_tabla;
+-------------------+
| campo             |
+-------------------+
| 1,2,3,4,5,6,7,8,9 |
+-------------------+
1 row in set (0.00 sec)

Haz la prueba y nos comentas

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir columnas en una en SQL

Publicado por Irati (5 intervenciones) el 11/04/2017 08:40:09
Muchísimas gracias por responder, ya lo he intentado concatenando los datos pero no me sirve, ya que la aplicación que debo utilizar no sabe leer los datos concatenados, únicamente sabe leerlos en lista.

Necesito que los resultados quedasen de la siguiente forma:

Campo
----------
1
2
3
4
5
6
7
8
9
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir columnas en una en SQL

Publicado por Irati (5 intervenciones) el 11/04/2017 10:16:30
Hay alguna manera de desconcatenar la cadena que se ha concatenado anteriormente en una sola columna, haciendo todo en una consulta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir columnas en una en SQL

Publicado por leonardo_josue (307 intervenciones) el 11/04/2017 16:12:09
Hola de nuevo Irati:

Lo que planteas en tu último post es distinto a lo explicaste en el primero...

Para "juntar" los valores de tu tabla en una sola columna, pero cada uno en un registro independiente, lo puedes hacer con UNION ALL:}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT var1 FROM tu_tabla
    -> UNION ALL
    -> SELECT var2 FROM tu_tabla
    -> UNION ALL
    -> SELECT var3 FROM tu_tabla;
+------+
| var1 |
+------+
|    1 |
|    4 |
|    7 |
|    2 |
|    5 |
|    8 |
|    3 |
|    6 |
|    9 |
+------+
9 rows in set (0.01 sec)

Para ordenar los registros, lo puedes hacer metiendo esto como una subconsulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT campo
    -> FROM
    -> ( SELECT var1 campo FROM tu_tabla
    ->   UNION ALL
    ->   SELECT var2 campo FROM tu_tabla
    ->   UNION ALL
    ->   SELECT var3 campo FROM tu_tabla ) T
    -> ORDER BY campo;
+-------+
| campo |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
|     5 |
|     6 |
|     7 |
|     8 |
|     9 |
+-------+
9 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir columnas en una en SQL

Publicado por Irati (5 intervenciones) el 12/04/2017 08:11:40
Muchas gracias Leo y perdón, si soy un desastre explicándome.

Lo he probado y si hace lo que necesito en el caso de que los números estén metidos ordenados, pero en el caso de que los datos estén desordenados en la primera tabla, no puedo utilizar order by.

A ver si me hago entender.

En el ejemplo puse números seguidos para hacerme entender (Cosa que no conseguí...) pero si tengo la siguiente tabla
1
2
3
4
5
6
7
+------+------+------+
| var1 | var2 | var3 |
+------+------+------+
|    1 |    4 |    2 |
|    6 |    5 |    7 |
|    3 |    9 |    8 |
+------+------+------+


Necesito que la lista sea la siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
+-------+
| campo |
+-------+
|     1 |
|     4 |
|     2 |
|     6 |
|     5 |
|     7 |
|     3 |
|     9 |
|     8 |
+-------+
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Unir columnas en una en SQL

Publicado por leonardo_josue (307 intervenciones) el 12/04/2017 16:23:10
Hola de nuevo Irati:

Veamos entonces si ahora entendí bien. Lo que te refieres con "ordenar los datos" es más bien que te respete el orden en el que están los valores en la tabla, es decir, primero presentar los valores del primer renglón, respetando también el orden de las columnas, es decir primero val1, después val2 y al último val3, ¿es correcto?

para hacer esto puedes "numerar" tus valores para indicarles el orden en que se deben presentar, de tal suerte que al final puedas utilizar la cláusula ORDER BY que es la que realizará la ordenación... y para no hacernos más bolas, mejor me explico con un ejemplo:

en primer lugar, es necesario NUMERAR tus registros para saber qué renglón debe de ir primero y cual después, lo que sería el equivalente al rownum... hay muchas formas de hacerlo, una de las más "simples" está descrita en esta liga:

http://cambrico.net/mysql/equivalente-del-rownum-de-oracle-en-mysql

de tal suerte, que puedes hacer algo así:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT @rn1:=@rn1+1 renglon, tu_tabla.*
    -> FROM (SELECT @rn1:=0) r, tu_tabla;
+---------+------+------+------+
| renglon | var1 | var2 | var3 |
+---------+------+------+------+
|       1 |    1 |    4 |    2 |
|       2 |    6 |    5 |    7 |
|       3 |    3 |    9 |    8 |
+---------+------+------+------+
3 rows in set (0.01 sec)

Ahora, con esta consulta, podrías seguir la idea que te puse en mi ejemplo de los UNION ALL, pero agregando también un "índice" que te indique el orden de la columna, en otras palabras, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT @rn1:=@rn1+1 renglon, 1 columna, tu_tabla.var1 var
    -> FROM (SELECT @rn1:=0) r, tu_tabla
    -> UNION ALL
    -> SELECT @rn2:=@rn2+1 renglon, 2 columna, tu_tabla.var2 var
    -> FROM (SELECT @rn2:=0) r, tu_tabla
    -> UNION ALL
    -> SELECT @rn3:=@rn3+1 renglon, 3 columna, tu_tabla.var3 var
    -> FROM (SELECT @rn3:=0) r, tu_tabla;
+---------+---------+------+
| renglon | columna | var  |
+---------+---------+------+
|       1 |       1 |    1 |
|       2 |       1 |    6 |
|       3 |       1 |    3 |
|       1 |       2 |    4 |
|       2 |       2 |    5 |
|       3 |       2 |    9 |
|       1 |       3 |    2 |
|       2 |       3 |    7 |
|       3 |       3 |    8 |
+---------+---------+------+
9 rows in set (0.00 sec)

Finalmente, con estas dos nuevas columnas que creaste, puedes aplicar la cláusula ORDER BY para que te ordene los datos tal como los necesitas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> SELECT var FROM
    -> (
    ->   SELECT @rn1:=@rn1+1 renglon, 1 columna, tu_tabla.var1 var
    ->   FROM (SELECT @rn1:=0) r, tu_tabla
    ->   UNION ALL
    ->   SELECT @rn2:=@rn2+1 renglon, 2 columna, tu_tabla.var2 var
    ->   FROM (SELECT @rn2:=0) r, tu_tabla
    ->   UNION ALL
    ->   SELECT @rn3:=@rn3+1 renglon, 3 columna, tu_tabla.var3 var
    ->   FROM (SELECT @rn3:=0) r, tu_tabla
    -> ) T
    -> ORDER BY renglon, columna;
+------+
| var  |
+------+
|    1 |
|    4 |
|    2 |
|    6 |
|    5 |
|    7 |
|    3 |
|    9 |
|    8 |
+------+
9 rows in set (0.02 sec)

haz la prueba y nos comentas.

Saludos
Leo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Unir columnas en una en SQL

Publicado por Irati (5 intervenciones) el 18/04/2017 08:05:10
Perdón la demora y muchísimas gracias, acabo de probarlo y funciona correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar