Oracle - Funcion para agrupar valores en un campo

 
Vista:

Funcion para agrupar valores en un campo

Publicado por Victor (1 intervención) el 02/09/2010 13:18:45
Buenas estoy buscando una funcion que me permita agrupar varios valores en un campo, algo similar a concatenar concat()

os explico, dada una tabla por ejemplo:

paciente________ sesion
-------_________-------
Victor__________13/2/10
Victor__________14/2/10
Juan___________14/2/10
Juan___________15/2/10
Juan___________21/2/10

que me resulte esto:

paciente__________sesiones
-------__________---------
Victor____________13/2/10 ; 14/2/10
Juan_____________14/2/10 ; 15/2/10 ; 21/2/10

"sesiones" pasaria a ser un texto concatenando las fechas, lo necesito hacer en una consulta mas compleja pero es para simplificarlo...
Llevo ayer y hoy buscando la solucion por internet y no encuentro la manera....
He intentado anidar un select con otro:

SELECT paciente, (select sesion from AGENDA where paciente = #### ) as "Sesiones" FROM AGENDA

pero no soy capaz de pasarle el valor de paciente al sub-select...

Es un requisito del cliente y antes de pasar a hacerlo con programacion en java me gustaria asegurarme de que no puedo hacerlo en consulta directa a BBDD... ademas sospecho que habra alguna manera delante de mis narices pero estoy bastante espeso

MUCHAS GRACIAS POR VUESTRA ATENCION
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: 6
Ha aumentado su posición en 7 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

RE:Funcion para agrupar valores en un campo

Publicado por Leonardo Josué (46 intervenciones) el 06/09/2010 23:20:35
Hola Victor, te comento que no es posible realizar lo que necesitas con subconsultas ya que la subconsulta regresaría múltiples registros, según yo no existe una función como tal que te regrese lo que estás solicitando pero puedes crear una, en mi caso hace algún tiempo tuve que hacer algo semejante y sólo conseguí hacerlo mediante un cursor, sé que los cursores no son muy recomendados, pero fue la única solución que encontré, sería más o menos así:

CREATE OR REPLACE FUNCTION F_SESIONES (P_PACIENTE VARCHAR2)
RETURN VARCHAR2
IS
TYPE CUR_TYP IS REF CURSOR;
V_CURSOR CUR_TYP;
V_QUERY VARCHAR2(100);
V_SESION VARCHAR(10);
V_FINAL VARCHAR2(400);
BEGIN
V_QUERY := 'SELECT SESION FROM AGENDA WHERE PACIENTE = '||P_PACIENTE||'';
OPEN V_CURSOR FOR V_QUERY;
FETCH V_CURSOR INTO V_SESION;
V_FINAL := V_SESION;--Para concatenar la primer sesion
WHILE V_CURSOR%FOUND LOOP
FETCH V_CURSOR INTO V_SESION;
EXIT WHEN V_CURSOR%NOTFOUND;
V_FINAL := V_FINAL||', '||V_SESION;--Para todas las sesiones adicionales
END LOOP;
RETURN(V_FINAL);
END F_SESIONES

Para seleccionarla sería algo más o menos así:

SELECT paciente, F_Sesiones(paciente) as "Sesiones" FROM AGENDA

Espero que te pueda servir de algo el código.

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