duda sql

Iniciado por sebapoli00, 20 Noviembre 2019, 00:25 AM

0 Miembros y 1 Visitante están viendo este tema.

sebapoli00

buenas, tengo que hacer una consulta que implica saber si una persona asistio a varios eventos, mostrar la fecha de el ultimo evento al que asistio y sino asistio a ninguno poner que no asistio

asi lo venia haciendo hasta el momento

Código (sql) [Seleccionar]

SELECT DISTINCT p.*, CASE
WHEN --busco si asistio a eventos THEN --subconsulta ultima fecha del evento al que asistio
Else 'No Asistió'
END AS Asistencia
FROM persona p, evento e, asistio a;


el asunto es que luego de buscar si asistio, no logro poner la ultima fecha del evento al que asistio

intente a través de una subconsulta que la devuelva, pero no lo he logrado

el resto del codigo funciona correctamente porque si en vez de la subconsulta le pongo x cosa por ejemplo 'asistio' me compila y la salida me la devuelve correctamente

como puedo hacer funcionar esto? alguna sugerencia?


Carloswaldo

No me parece que sea necesario hacer una subconsulta. Yo haría algo así:

Código (sql) [Seleccionar]
SELECT p.nombre, CASE
WHEN max(e.fecha) IS NOT NULL THEN
max(e.fecha)::text
ELSE
'No Asistió'
END
FROM persona p
LEFT JOIN asistio a ON a.id_persona = p.id_persona
JOIN evento e ON e.id_evento = a.id_evento
GROUP BY p.nombre


No dices en qué motor estás trabajando, esto lo hice en PostgreSQL pero asumo que puedes hacer algo parecido en otros motores. Además no sé cuál es la estructura de las tablas pero estoy asumiendo que es una relación muchos a muchos entre persona y evento que se rompe con la tabla asistio.

sebapoli00

#2
Estoy trabajando en sql developer y la tabla evento y persona se relacionan con la relacion asistio que va de 0 a n

No estoy en mi casa como para probar ese código pero en viento pueda te digo!


me lanza el mismo error que tenia antes:

ORA-00932: tipos de dato inconsistentes: se esperaba DATE se ha obtenido CHAR
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:   
*Action:
Error en la línea: 232, columna: 2

MOD: No hacer doble post. Usa el boton modificar.

Carloswaldo

El problema es que en una misma columna de resultado intentas retornar datos de tipos diferentes (DATE en el caso de que hayan asistido, y VARCHAR si no han asistido), así que tienes que incluir un casting para que funcione. En mi ejemplo el "::text" era el casting, como ya veo que estás en Oracle, tendrás que hacer el casting así:

Código (sql) [Seleccionar]
CAST(MAX(e.fecha) AS varchar(50))

Cuéntanos cómo te fue.

sebapoli00

Si! Ya lo solucione de esa manera, muchisimas gracias por la ayuda!