Consulta Sencilla pero compleja.

14/04/2010 - 10:20 por 4234234 | Informe spam
Hola,

tengo dos tablas para gestionar el personal.

t_personal (listado de gente con su nombre y otros datos personales)
id_personal
nombre_personal
...etc

t_periodos_personal (periodos de actividad de la gente, con la
categoria y funcion que desempeño en ese período, que no siempre es el
mismo)
fk_periodo_personal_persona,
fk_periodo_personal_categoria,
fk_periodo_personal_funcion,
y el período: fk_periodo_personal_desde y fk_periodo_personal_hasta.

Pues bien, me interesa sacar un listado de toda la gente, con la
última funcion y categoria que tuvo, y solo se hacerlo con esta
consulta, la cual veo muy compleja para lo que quiero ¿no?

gracias

SELECT TOP (100) PERCENT id_personal AS Chequeo, personal_nombre
AS Nombre,
(SELECT TOP (1)
fk_periodo_personal_categoria
FROM dbo.t_periodos_personal
WHERE (fk_periodo_personal_persona dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Categoria,
(SELECT TOP (1)
fk_periodo_personal_funcion
FROM dbo.t_periodos_personal AS
t_periodos_personal_1
WHERE (fk_periodo_personal_persona dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Funcion
FROM dbo.t_personal
ORDER BY Chequeo

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
14/04/2010 - 14:41 | Informe spam
La sentencia devolvera lo que deseas pero de una forma costosa, pues por cada
persona evaluara dos consultas correlacionadas que a la final apuntan a la
misma fila en la tabla [t_periodos_personal].

Cual version de SQL Server usas?

Aqui tienes una posible solucion, pero usa facilidades introducidas en SS
2005, que son CTE y funciones de rangos.

WITH r_set AS (
SELECT
p.id_personal AS Chequeo,
p.personal_nombre AS Nombre,
p.chequeo,
pp.fk_periodo_personal_categoria AS Categoria,
pp.fk_periodo_personal_funcion AS Funcion,
ROW_NUMBER() OVER(PARTITION BY p.id_personal ORDER BY
pp.fk_periodo_personal_desde DESC) AS rn
FROM
dbo.t_personal AS p
INNER JOIN
dbo.t_periodos_personal AS pp
ON pp.fk_periodo_personal_persona = p.id_personal
)
SELECT
Chequeo,
Nombre,
Categoria,
Funcion
FROM
r_set
WHERE
rn = 1
ORDER BY
Chequeo;
GO


AMB


"4234234" wrote:

Hola,

tengo dos tablas para gestionar el personal.

t_personal (listado de gente con su nombre y otros datos personales)
id_personal
nombre_personal
etc

t_periodos_personal (periodos de actividad de la gente, con la
categoria y funcion que desempeño en ese período, que no siempre es el
mismo)
fk_periodo_personal_persona,
fk_periodo_personal_categoria,
fk_periodo_personal_funcion,
y el período: fk_periodo_personal_desde y fk_periodo_personal_hasta.

Pues bien, me interesa sacar un listado de toda la gente, con la
última funcion y categoria que tuvo, y solo se hacerlo con esta
consulta, la cual veo muy compleja para lo que quiero ¿no?

gracias

SELECT TOP (100) PERCENT id_personal AS Chequeo, personal_nombre
AS Nombre,
(SELECT TOP (1)
fk_periodo_personal_categoria
FROM dbo.t_periodos_personal
WHERE (fk_periodo_personal_persona > dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Categoria,
(SELECT TOP (1)
fk_periodo_personal_funcion
FROM dbo.t_periodos_personal AS
t_periodos_personal_1
WHERE (fk_periodo_personal_persona > dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Funcion
FROM dbo.t_personal
ORDER BY Chequeo
.

Respuesta Responder a este mensaje
#2 4234234
17/04/2010 - 18:25 | Informe spam
On 14 abr, 14:41, Alejandro Mesa
wrote:
La sentencia devolvera lo que deseas pero de una forma costosa, pues por cada
persona evaluara dos consultas correlacionadas que a la final apuntan a la
misma fila en la tabla [t_periodos_personal].

Cual version de SQL Server usas?

Aqui tienes una posible solucion, pero usa facilidades introducidas en SS
2005, que son CTE y funciones de rangos.

WITH r_set AS (
SELECT
        p.id_personal AS Chequeo,
        p.personal_nombre AS Nombre,
        p.chequeo,
        pp.fk_periodo_personal_categoria AS Categoria,
        pp.fk_periodo_personal_funcion AS Funcion,
        ROW_NUMBER() OVER(PARTITION BY p.id_personal ORDER BY
pp.fk_periodo_personal_desde DESC) AS rn
FROM
        dbo.t_personal AS p
        INNER JOIN
        dbo.t_periodos_personal AS pp
        ON pp.fk_periodo_personal_persona = p.id_personal
)
SELECT
        Chequeo,
        Nombre,
        Categoria,
        Funcion
FROM
        r_set
WHERE
        rn = 1
ORDER BY
        Chequeo;
GO

AMB



"4234234" wrote:
> Hola,

> tengo dos tablas para gestionar el personal.

> t_personal (listado de gente con su nombre y otros datos personales)
> id_personal
> nombre_personal
> etc

> t_periodos_personal (periodos de actividad de la gente, con la
> categoria y funcion que desempeño en ese período, que no siempre es el
> mismo)
> fk_periodo_personal_persona,
> fk_periodo_personal_categoria,
> fk_periodo_personal_funcion,
> y el período: fk_periodo_personal_desde y fk_periodo_personal_hasta.

> Pues bien, me interesa sacar un listado de toda la gente, con la
> última funcion y categoria que tuvo, y solo se hacerlo con esta
> consulta, la cual veo muy compleja para lo que quiero ¿no?

> gracias

> SELECT     TOP (100) PERCENT id_personal AS Chequeo, personal_nombre
> AS Nombre,
>                           (SELECT     TOP (1)
> fk_periodo_personal_categoria
>                             FROM          dbo.t_periodos_personal
>                             WHERE      (fk_periodo_personal_persona > > dbo.t_personal.id_personal)
>                             ORDER BY fk_periodo_personal_persona,
> periodo_personal_hasta DESC) AS Categoria,
>                           (SELECT     TOP (1)
> fk_periodo_personal_funcion
>                             FROM          dbo.t_periodos_personal AS
> t_periodos_personal_1
>                             WHERE      (fk_periodo_personal_persona > > dbo.t_personal.id_personal)
>                             ORDER BY fk_periodo_personal_persona,
> periodo_personal_hasta DESC) AS Funcion
> FROM         dbo.t_personal
> ORDER BY Chequeo
> .- Ocultar texto de la cita -

- Mostrar texto de la cita -



gracias compañero.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida