SQL - Varios resultados en una misma línea

 
Vista:
sin imagen de perfil

Varios resultados en una misma línea

Publicado por Odairc (1 intervención) el 17/05/2016 09:18:37
Hola a todos.

Escribo para ver si podeis echarme un cable en cuanto a la posibilidad de realizar lo siguiente.

Supongamos que tengo una consulta en la que me da como resultado tres líneas diferentes que difieren en un solo campo:

1 - 1 - 1 - A
1 - 1 - 1 - B
1 - 1 - 1 - C

Lo que necesito es poder agrupar por los valores que son idénticos y poder colocar los valores diferentes en distintos campos en una sola línea. Cada valor en una celda diferente, no los tres en una única celda separados por por algún separador, de manera que quedara así:

1 - 1 - 1 - A - B - C

He buscado por internet y la única posibilidad que me ha salido es agrupar los 3 campos en uno y mostrarlo, pero necesito que cada valor esté en una celda diferente.

Muchas gracias. Saludos.
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Varios resultados en una misma línea

Publicado por leonardo_josue (1173 intervenciones) el 17/05/2016 16:52:18
Hola Odairc:

No nos dices con qué BD's estás trabajando, este dato es muy importante porque aunque la mayoría de los DBMS's utilizan una sintaxis semejante, también hay diferencias muy importantes entre cada uno de ellos. Lo que quieres hacer, se puede de varias formas, la más común aunque definitivamente no la mejor, es hacerlo con subconsultas y JOIN's. Veamos un ejemplo:

Supongamos que tienes estos datos en tu tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tabla;
+------+------+------+-------+
| id1  | id2  | id3  | campo |
+------+------+------+-------+
|    1 |    1 |    1 | A     |
|    1 |    1 |    1 | B     |
|    1 |    1 |    1 | C     |
|    1 |    1 |    2 | A     |
|    1 |    1 |    2 | C     |
|    1 |    1 |    3 | B     |
|    1 |    1 |    3 | C     |
|    1 |    1 |    4 | A     |
+------+------+------+-------+
8 rows in set (0.00 sec)

En tu correo no lo dices, pero puedo suponer que los tres primeros campos forman tu "LLAVE", y serían los campos que quieres agrupar. El primer paso sería obtener las distintas combinaciones "únicas" para estos campos, esto lo haces con un SELECT-DISTINCT:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT DISTINCT id1, id2, id3 FROM tabla;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
|    1 |    1 |    1 |
|    1 |    1 |    2 |
|    1 |    1 |    3 |
|    1 |    1 |    4 |
+------+------+------+
4 rows in set (0.00 sec)

Ahora, lo que tienes que hacer para cada valor que quieras colocar en una columna, es hacer una subconsulta, de tal suerte que para el valor "A" harías algo como esto;

1
2
3
4
5
6
7
8
9
mysql> SELECT id1, id2, id3, campo FROM Tabla WHERE campo = 'A';
+------+------+------+-------+
| id1  | id2  | id3  | campo |
+------+------+------+-------+
|    1 |    1 |    1 | A     |
|    1 |    1 |    2 | A     |
|    1 |    1 |    4 | A     |
+------+------+------+-------+
3 rows in set (0.00 sec)

Ahora, el truco está en hacer un LEFT JOIN para cada una de estas subconsultas, de tal suerte que te quede algo así:

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
27
28
29
30
31
mysql> SELECT t1.id1, t1.id2, t1.id3, T2.campo, T3.campo, T4.campo
    -> FROM
    ->   ( SELECT DISTINCT id1, id2, id3
    ->     FROM tabla ) T1
    -> LEFT JOIN
    ->   ( SELECT id1, id2, id3, campo
    ->     FROM Tabla
    ->     WHERE campo = 'A') T2 ON T1.id1 = T2.id1 AND
    ->                              T1.id2 = T2.id2 AND
    ->                              T1.id3 = T2.id3
    -> LEFT JOIN
    ->   ( SELECT id1, id2, id3, campo
    ->     FROM Tabla
    ->     WHERE campo = 'B') T3 ON T1.id1 = T3.id1 AND
    ->                              T1.id2 = T3.id2 AND
    ->                              T1.id3 = T3.id3
    -> LEFT JOIN
    ->   ( SELECT id1, id2, id3, campo
    ->     FROM Tabla
    ->     WHERE campo = 'C') T4 ON T1.id1 = T4.id1 AND
    ->                              T1.id2 = T4.id2 AND
    ->                              T1.id3 = T4.id3;
+------+------+------+-------+-------+-------+
| id1  | id2  | id3  | campo | campo | campo |
+------+------+------+-------+-------+-------+
|    1 |    1 |    1 | A     | B     | C     |
|    1 |    1 |    2 | A     | NULL  | C     |
|    1 |    1 |    3 | NULL  | B     | C     |
|    1 |    1 |    4 | A     | NULL  | NULL  |
+------+------+------+-------+-------+-------+
4 rows in set (0.00 sec)

Y así con todos los valores distintos que tengas en tu campo... El principal problema con este tipo de consultas es que son bastante lentas, pero si te sirve, pues adelante.

Como te comenté, hay otras formas de hacerlo, pero eso también dependerá del motor de BD's con el que estés trabajando. Por lo pronto dale un vistazo a la consulta 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