SQL - Ayuda con SQL!

   
Vista:

Ayuda con SQL!

Publicado por Geovanny Reyes Poveda (2 intervenciones) el 28/04/2015 00:26:37
estimados

tengo una tabla de 2 campos con la sgte info

id status
1 a
1 b
1 c
2 a
2 b
3 a
4 a
4 b
4 c
4 d

como puedo hacer para obtener el siguiente resultado
id s1 s2 s3 s4
1 a b c
2 a b
3 a
4 a b c d

podria hacer pivot? o me tocaria hacer un procedimiento almacenado
si es por el segundo... como arrancaria?
muchas gracias de antemano,
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
Imágen de perfil de Isaias

Ayuda con SQL!

Publicado por Isaias (690 intervenciones) el 28/04/2015 00:54:12
¿Ya lo intentaste con PIVOT?
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

Ayuda con SQL!

Publicado por Geovanny Reyes Poveda (2 intervenciones) el 28/04/2015 00:56:19
No le veo por ningun lado hacerlo con Pivot... si tienes una pista... puedes decirme?
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

Ayuda con SQL!

Publicado por leonardo_josue (877 intervenciones) el 28/04/2015 16:32:02
Hola Geovanny:

Antes que nada acláranos algunos puntos...

1. ¿Qué Motor de BD's estás utilizando? Esto es muy importante pues no todos los DBMS's manejan la función PIVOT, por lo tanto es imposible darte una respuesta puntual
2. ¿el valor para cada columna siempre es el mismo? es decir, si el registro tiene un valor 'a' ¿esta debe ir siempre en la columna S1?
3. ¿Puede haber más de un id con un valor repetido de estatus?, por ejemplo que el id = 1 tengas dos o más estatus 'a'?

a partir de estas respuestas puede que variar la solución.

Una manera de hacerlo sin PIVOT es utilizando funciones de agrupación, esta es una manera un poco 'tramposa', pero igual te serviría, sería más o menos 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
32
33
34
mysql> SELECT * FROM tabla;
+------+---------+
| id   | estatus |
+------+---------+
|    1 | a       |
|    1 | b       |
|    1 | c       |
|    2 | a       |
|    2 | b       |
|    3 | a       |
|    4 | a       |
|    4 | b       |
|    4 | c       |
|    4 | d       |
+------+---------+
10 rows in set (0.00 sec)
 
mysql> SELECT
    ->    id,
    ->    MAX(IF (estatus = 'a', estatus, NULL)) s1,
    ->    MAX(IF (estatus = 'b', estatus, NULL)) s2,
    ->    MAX(IF (estatus = 'c', estatus, NULL)) s3,
    ->    MAX(IF (estatus = 'd', estatus, NULL)) s4
    -> FROM tabla
    -> GROUP BY id;
+------+------+------+------+------+
| id   | s1   | s2   | s3   | s4   |
+------+------+------+------+------+
|    1 | a    | b    | c    | NULL |
|    2 | a    | b    | NULL | NULL |
|    3 | a    | NULL | NULL | NULL |
|    4 | a    | b    | c    | d    |
+------+------+------+------+------+
4 rows in set (0.00 sec)

Esta solución sólo es válida si en cada columna S1 debe aparecer el mismo valor, es decir, funciona con los datos que pones de ejemplo, si tienes más estatus deberás agregar tantos MAX(IF... como sean necesarios. El ejercicio está hecho en MySQL, pero debería de funcionar en la mayoría de los DBMS's

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