Oracle - Obtener distintos valores (en columnas) de un solo campo

 
Vista:

Obtener distintos valores (en columnas) de un solo campo

Publicado por Jonathan Faure (3 intervenciones) el 24/03/2015 14:44:06
Estimados,

tengo una base de teléfonos en la cual para el campo rut tengo varios números de teléfonos para el campo fono_numero, ahora necesito externalizar esta información a una nueva tabla pero colocando los distintos numeros de telefono en distintas columnas, obteniendo campos como fono_numero_1, fono_numero_2, fono_numero_3 ...... etc.
he intentado a traves de unir 3 consultas pero no logro obtener 3 columnas distintas para un solo registro,

SELECT x.fono_cont_1,
x.fono_cont_2,
x.fono_cont_3

FROM (SELECT to_number(t.fono_numero) fono_numero_1, 0 fono_numero_2, 0 fono_numero_3
FROM TELEFONOS T
WHERE T.RUT = '11226804'
AND ROWNUM <= 3

UNION ALL

SELECT 0 fono_numero_1, to_number(t.fono_numero) fono_numero_2, 0 fono_numero_3
FROM TELEFONOS T
WHERE T.RUT = '11226804'
AND ROWNUM <= 3

UNION ALL

SELECT 0 fono_numero_1, 0 fono_numero_2, to_number(t.fono_numero) fono_numero_3
FROM TELEFONOS T
WHERE T.RUT = '11226804'
AND ROWNUM <= 3) X

pero lo que obtengo es algo así:

thump_9335969asd

quedo atento a sus comentarios, de ante mano gracias por sus ideas
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

Obtener distintos valores (en columnas) de un solo campo

Publicado por Jorge (21 intervenciones) el 24/03/2015 15:26:46
En la tabla actual hay algun campo que diferencie un número de telefono de otro? ej: casa, oficina, local comercial, etc.? O es libre? un rut puede tener una cantidad ilimitada de teléfonos? porque si es asi es imposible, la cantidad de columnas debería ser fija por tanto deberías tener una cantidad limitada de números de telefonos por rut.

Por último, la complejidad estaría en obtener el select que obtenga lo que necesitas. Pero si lo que te interesa es pasarlo a otra tabla lo más práctico es crear un procedure con un cursor que recorra los ruts (por cada rut hace el insert a la nueva tabla), y por cada rut recorra los telefonos que le pertenecen (por cada telefono hace un update a la columna q corresponde telefono1, telefono2, etc). Aun asi deberias definir la cantidad de telefonos que vas a guardar por cada rut ya que las columnas de tu tabla serán fijas.
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

Obtener distintos valores (en columnas) de un solo campo

Publicado por Jonathan Faure (3 intervenciones) el 24/03/2015 15:35:52
Gracias Jorge por tu respuesta, la verdad lo que realmente me complica es mostrar los registros del mismo campo como columnas distintas, este registro tiene un campo que identifica si es comercial, particular o de contacto y no tiene limite de ingreso, pero yo solo debo recuperar 3 registros de cada tipo logrando un total de 9 columnas con registros distintos, pero solo consigo recuperar 1 registro de contacto, 1 comercial y 1 particular, gracias por tu atención
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
sin imagen de perfil

Obtener distintos valores (en columnas) de un solo campo

Publicado por Jorge (21 intervenciones) el 24/03/2015 16:44:46
Hola, bueno esto sería algo simplificado de lo que necesitas, un campo por cada columna. Debido a que ouede haber varios numero del tipo Comercial para un RUT se ha agregado el rownum=1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT rut,
       (SELECT to_number(fono_numero)
        FROM telefonos t1
        WHERE t.rut = t1.rut
        AND t1.tipo = 'COMERCIAL'
        AND rownum = 1)  fono_comercial_1,
       (SELECT to_number(fono_numero)
        FROM telefonos t2
        WHERE t.rut = t2.rut
        AND t2.tipo = 'PARTICULAR'
        AND rownum = 1)  fono_particular_1,
       (SELECT to_number(fono_numero)
        FROM telefonos t3
        WHERE t.rut = t3.rut
        AND t3.tipo = 'CONTACTO'
        AND rownum = 1)  fono_contacto_1
FROM telefonos t

Pero obtener el segundo numero Comercial del rut no va a ser posible a menos que hagas un tratamiento a tu tabla inicial. Recuerda que en una base de datos cada fila debe ser unico. Por tanto necesitas agregar un dato mas a tu tabla de telefonos de modo que diferencia un numero comercial de otro. Puede ser un secuencial por rut y tipo de telefono. de manera que tengas algo asi:

1
2
3
4
5
6
7
8
9
Tabla Telefono
RUT - TIPO - SECUENCIAL - TELEFONO
0001 - COMERCIAL - 1 - 111212212
0001 - COMERCIAL - 2 - 111212234
0001 - COMERCIAL - 3 - 111213341
0001 - COMERCIAL - 4 - 134234221
0001 - CONTACTO - 1 - 111212212
0001 - CONTACTO - 2 - 34342234
0001 - PARTICULAR - 1 - 144213341

Si agregas el campo Secuencial, podrías usarlo para obtener el fono_comercial_2, y fono_comercial_3 agregando dicho campo en el where, con esto ya podrías sacar el rownum. Algo asi:

1
2
3
4
5
(SELECT to_number(fono_numero)
        FROM telefonos t4
        WHERE t.rut = t4.rut
        AND t4.tipo = 'COMERCIAL'
        AND t4.secuencial = 1)  fono_comercial_2

Si tienes alguna duda comentame.
Saludos
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

Obtener distintos valores (en columnas) de un solo campo

Publicado por Jonathan Faure (3 intervenciones) el 25/03/2015 14:21:33
Muchas gracias a todos por sus respuestas, finalmente lo que hice fue algo como esto

SELECT * FROM

(SELECT to_number(t1.fono_numero) fono_numero_1
FROM TELEFONOS T1
WHERE T1.RUT = '11226804'
AND ROWNUM <= 1) T1,

(SELECT to_number(t2.fono_numero) fono_numero_2
FROM TELEFONOS T2
WHERE T2.RUT = '11226804'
AND ROWNUM <= 1
AND to_number(t2.fono_numero) <> (SELECT to_number(t1.fono_numero) fono_numero_1
FROM TELEFONOS T1
WHERE T1.RUT = '11226804'
AND ROWNUM <= 1)) T2,

(SELECT to_number(t3.fono_numero) fono_numero_3
FROM TELEFONOS T3
WHERE T3.RUT = '11226804'
AND ROWNUM <= 1
AND to_number(t3.fono_numero) <> (SELECT to_number(t2.fono_numero) fono_numero_2
FROM TELEFONOS T2
WHERE T2.RUT = '11226804'
AND ROWNUM <= 1
AND to_number(t2.fono_numero) <> (SELECT to_number(t1.fono_numero) fono_numero_1
FROM TELEFONOS T1
WHERE T1.RUT = '11226804'
AND ROWNUM <= 1))) T3



vuelvo a reiterar las gracias a todos por su atención, saludos.
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