SQL - cambiar filas a columnas

   
Vista:

cambiar filas a columnas

Publicado por julio cesar (1 intervención) el 22/06/2015 17:09:44
buen día a todos.
tengo esta tabla
tabla1

y necesito tener los datos como esta otra tabla y no se como hacerlo en sql, estoy usando IBExpert
tabla2

alguien puede ayudarme?
se los agadecere mucho!
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

cambiar filas a columnas

Publicado por leonardo_josue (877 intervenciones) el 22/06/2015 21:05:35
Buenas tardes Julio Cesar:

No he trabajado con IBExpert, pero hablando estrictamente de SQL puedes hacer lo que quieres de distintas formas. Una de ellas sería utilizar el operador PIVOT, que sirve justamente para cambiar de filas a columnas, sin embargo, no todos los DBMS's manejan este operador, es cuestión de que le preguntes a SAN GOOGLE si IBExpert lo soporta o buscar alternativas para hacerlo.

Una manera "estándar" sería con INNER JOINS, simulando que tienes varias tablas en lugar de una sola... es decir, algo como esto:


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
mysql> SELECT * FROM tabla;
+----------+------------+-----------+-------------+
| articulo | nombre_art | proveedor | nombre_prov |
+----------+------------+-----------+-------------+
|        1 | A          | 1A        | JUAN        |
|        1 | A          | 2A        | JOSE        |
|        1 | A          | 3A        | PEDRO       |
|        2 | B          | 1B        | LUIS        |
|        2 | B          | 2B        | RUBEN       |
|        2 | B          | 3B        | OMAR        |
|        3 | C          | 1C        | JOSUE       |
|        3 | C          | 2C        | FELIPE      |
|        3 | C          | 3C        | ROBERTO     |
+----------+------------+-----------+-------------+
9 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla WHERE proveedor LIKE '1%';
+----------+------------+-----------+-------------+
| articulo | nombre_art | proveedor | nombre_prov |
+----------+------------+-----------+-------------+
|        1 | A          | 1A        | JUAN        |
|        2 | B          | 1B        | LUIS        |
|        3 | C          | 1C        | JOSUE       |
+----------+------------+-----------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla WHERE proveedor LIKE '2%';
+----------+------------+-----------+-------------+
| articulo | nombre_art | proveedor | nombre_prov |
+----------+------------+-----------+-------------+
|        1 | A          | 2A        | JOSE        |
|        2 | B          | 2B        | RUBEN       |
|        3 | C          | 2C        | FELIPE      |
+----------+------------+-----------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla WHERE proveedor LIKE '3%';
+----------+------------+-----------+-------------+
| articulo | nombre_art | proveedor | nombre_prov |
+----------+------------+-----------+-------------+
|        1 | A          | 3A        | PEDRO       |
|        2 | B          | 3B        | OMAR        |
|        3 | C          | 3C        | ROBERTO     |
+----------+------------+-----------+-------------+
3 rows in set (0.00 sec)

Con esto, lo único que haces es hacer un INNER JOIN entre las tablas;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT T1.*, T2.proveedor, T2.nombre_prov, T3.proveedor, T3.nombre_prov
    -> FROM
    -> ( SELECT * FROM tabla WHERE proveedor LIKE '1%') T1
    -> INNER JOIN
    -> ( SELECT * FROM tabla WHERE proveedor LIKE '2%') T2 ON T1.articulo = T2.articulo
    -> INNER JOIN
    -> ( SELECT * FROM tabla WHERE proveedor LIKE '3%') T3 ON T1.articulo = T3.articulo;
+----------+------------+-----------+-------------+-----------+-------------+-----------+-------------+
| articulo | nombre_art | proveedor | nombre_prov | proveedor | nombre_prov | proveedor | nombre_prov |
+----------+------------+-----------+-------------+-----------+-------------+-----------+-------------+
|        1 | A          | 1A        | JUAN        | 2A        | JOSE        | 3A        | PEDRO       |
|        2 | B          | 1B        | LUIS        | 2B        | RUBEN       | 3B        | OMAR        |
|        3 | C          | 1C        | JOSUE       | 2C        | FELIPE      | 3C        | ROBERTO     |
+----------+------------+-----------+-------------+-----------+-------------+-----------+-------------+
3 rows in set (0.00 sec)

Aquí el detalle está en que si hay registros incompletos o la información no sigue el formato que estás manejando entonces puede que no funcione... Dale un vistazo 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