Ayuda consulta

19/10/2006 - 11:23 por Paco | Informe spam
Hola a todos
Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
mi seria una vista pero si tiene que ser un funcion pues también me iria
bien. Os explico la situación y a ver si alguien me puede ayudar.

Tengo las siguientes tablas :

Departamentos :
Departamento (k)
Descripcion

Personas:
Departemento (k)
Numero (k)
Nombre
Apellido1
Apellido2

El campo Numero de la tabla Personas no es consecutivo y puede no empezar
por 0, es decir, las filas pueden estar así:
Departamento1,2,nombre,apellido
Departamento1,4,nombre,apellido
Departamento2,1,nombre,apellido
Departemanto2,2,nombre,apellido

Me gustaría obtener una consulta por departamento con las dos primeras
personas de cada departamento. Algo así:

Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2

Muchas gracias a todos

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
19/10/2006 - 15:13 | Informe spam
Paco,

Cual seria el criterio a usar para saber que esas dos personas son las dos
primeras del departamento?


AMB

"Paco" wrote:

Hola a todos
Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
mi seria una vista pero si tiene que ser un funcion pues también me iria
bien. Os explico la situación y a ver si alguien me puede ayudar.

Tengo las siguientes tablas :

Departamentos :
Departamento (k)
Descripcion

Personas:
Departemento (k)
Numero (k)
Nombre
Apellido1
Apellido2

El campo Numero de la tabla Personas no es consecutivo y puede no empezar
por 0, es decir, las filas pueden estar así:
Departamento1,2,nombre,apellido
Departamento1,4,nombre,apellido
Departamento2,1,nombre,apellido
Departemanto2,2,nombre,apellido

Me gustaría obtener una consulta por departamento con las dos primeras
personas de cada departamento. Algo así:

Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2

Muchas gracias a todos
Respuesta Responder a este mensaje
#2 Paco
19/10/2006 - 15:33 | Informe spam
Pues el criterio es simple los dos primeros que se encuentre en orden de
clave primaria

"Alejandro Mesa" wrote:

Paco,

Cual seria el criterio a usar para saber que esas dos personas son las dos
primeras del departamento?


AMB

"Paco" wrote:

> Hola a todos
> Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
> mi seria una vista pero si tiene que ser un funcion pues también me iria
> bien. Os explico la situación y a ver si alguien me puede ayudar.
>
> Tengo las siguientes tablas :
>
> Departamentos :
> Departamento (k)
> Descripcion
>
> Personas:
> Departemento (k)
> Numero (k)
> Nombre
> Apellido1
> Apellido2
>
> El campo Numero de la tabla Personas no es consecutivo y puede no empezar
> por 0, es decir, las filas pueden estar así:
> Departamento1,2,nombre,apellido
> Departamento1,4,nombre,apellido
> Departamento2,1,nombre,apellido
> Departemanto2,2,nombre,apellido
>
> Me gustaría obtener una consulta por departamento con las dos primeras
> personas de cada departamento. Algo así:
>
> Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
> Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
>
> Muchas gracias a todos
Respuesta Responder a este mensaje
#3 Alejandro Mesa
19/10/2006 - 16:05 | Informe spam
Paco,

Perfecto. Entonces puedes usar la siguiente sentencia.

select
d.Departemento,
d.Descripcion,
p.Nombre,
p.Apellido1,
p.Apellido2
from
dbo.Departamentos as d
inner join
dbo.Personas as p
on d.Departamento = p.Departemento
where
p.Numero in (
select top 2 p1.Numero
from dbo.Personas as p1
where p1.Departamento = d.Departamento
order by p1.Numero ASC
)
order by
d.Departemento,
p.Nombre,
p.Apellido1,
p.Apellido2
go


AMB

"Paco" wrote:

Pues el criterio es simple los dos primeros que se encuentre en orden de
clave primaria

"Alejandro Mesa" wrote:

> Paco,
>
> Cual seria el criterio a usar para saber que esas dos personas son las dos
> primeras del departamento?
>
>
> AMB
>
> "Paco" wrote:
>
> > Hola a todos
> > Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
> > mi seria una vista pero si tiene que ser un funcion pues también me iria
> > bien. Os explico la situación y a ver si alguien me puede ayudar.
> >
> > Tengo las siguientes tablas :
> >
> > Departamentos :
> > Departamento (k)
> > Descripcion
> >
> > Personas:
> > Departemento (k)
> > Numero (k)
> > Nombre
> > Apellido1
> > Apellido2
> >
> > El campo Numero de la tabla Personas no es consecutivo y puede no empezar
> > por 0, es decir, las filas pueden estar así:
> > Departamento1,2,nombre,apellido
> > Departamento1,4,nombre,apellido
> > Departamento2,1,nombre,apellido
> > Departemanto2,2,nombre,apellido
> >
> > Me gustaría obtener una consulta por departamento con las dos primeras
> > personas de cada departamento. Algo así:
> >
> > Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
> > Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> > Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> >
> > Muchas gracias a todos
Respuesta Responder a este mensaje
#4 Paco
19/10/2006 - 17:01 | Informe spam
Hola Alejandro

Antes de nada gracias por la respuesta.
Pero creo que no me he explicado bien. Con esta consulta que me propones lo
que obtengo son las dos primeras filas de cada Departamento en la tabla
Personas.
Lo que me gustaría hacer y no sé como, es juntar esos dos registros en uno.

Algo así es lo que obtengo con la consulta que me propones:

Departamento1 Descripcion1 Nombre1 Apellido1
Departamento1 Descripcion1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1
Departamento2 Descripcion2 Nombre2 Apellido2
Departamento3 Descripcion3 Nombre1 Apellido1
Departamento3 Descripcion3 Nombre2 Apellido2

Algo así es lo que me gustaría obtener:

Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2

"Alejandro Mesa" wrote:

Paco,

Perfecto. Entonces puedes usar la siguiente sentencia.

select
d.Departemento,
d.Descripcion,
p.Nombre,
p.Apellido1,
p.Apellido2
from
dbo.Departamentos as d
inner join
dbo.Personas as p
on d.Departamento = p.Departemento
where
p.Numero in (
select top 2 p1.Numero
from dbo.Personas as p1
where p1.Departamento = d.Departamento
order by p1.Numero ASC
)
order by
d.Departemento,
p.Nombre,
p.Apellido1,
p.Apellido2
go


AMB

"Paco" wrote:

> Pues el criterio es simple los dos primeros que se encuentre en orden de
> clave primaria
>
> "Alejandro Mesa" wrote:
>
> > Paco,
> >
> > Cual seria el criterio a usar para saber que esas dos personas son las dos
> > primeras del departamento?
> >
> >
> > AMB
> >
> > "Paco" wrote:
> >
> > > Hola a todos
> > > Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
> > > mi seria una vista pero si tiene que ser un funcion pues también me iria
> > > bien. Os explico la situación y a ver si alguien me puede ayudar.
> > >
> > > Tengo las siguientes tablas :
> > >
> > > Departamentos :
> > > Departamento (k)
> > > Descripcion
> > >
> > > Personas:
> > > Departemento (k)
> > > Numero (k)
> > > Nombre
> > > Apellido1
> > > Apellido2
> > >
> > > El campo Numero de la tabla Personas no es consecutivo y puede no empezar
> > > por 0, es decir, las filas pueden estar así:
> > > Departamento1,2,nombre,apellido
> > > Departamento1,4,nombre,apellido
> > > Departamento2,1,nombre,apellido
> > > Departemanto2,2,nombre,apellido
> > >
> > > Me gustaría obtener una consulta por departamento con las dos primeras
> > > personas de cada departamento. Algo así:
> > >
> > > Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
> > > Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> > > Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> > >
> > > Muchas gracias a todos
Respuesta Responder a este mensaje
#5 Alejandro Mesa
19/10/2006 - 18:23 | Informe spam
Paco,

Guarda ese resultado en una tabla, agrega una columna para hacer un ranking
(quien es 1 y quien es 2) luego haces un pivot.

create table #t (
departamento int,
descripcion varchar(50),
numero int,
nombre varchar(50),
apellido1 varchar(50),
apellido2 varchar(50),
rank int
)

insert into #t
select
d.Departamento,
d.Descripcion,
p.Numero,
p.Nombre,
p.Apellido1,
p.Apellido2,
null
from
dbo.Departamentos as d
inner join
dbo.Personas as p
on d.Departamento = p.Departemento
where
p.Numero in (
select top 2 p1.Numero
from dbo.Personas as p1
where p1.Departamento = d.Departamento
order by p1.Numero ASC
)

update #t
set rank = (
select count(*)
from #t as a
where a.departamento = #t.departamento and a.numero <= #t.numero
)

select
Departamento,
Descripcion,
max(case when rank = 1 then nombre end) as nombre_1,
max(case when rank = 1 then apellido1 end) as apellido1_1,
max(case when rank = 1 then apellido2 end) as apellido2_1,
max(case when rank = 2 then nombre end) as nombre_2,
max(case when rank = 2 then apellido1 end) as apellido1_2,
max(case when rank = 2 then apellido2 end) as apellido2_2,
from
#t
group by
Departemento,
Descripcion

drop table #t
go


"Paco" wrote:

Hola Alejandro

Antes de nada gracias por la respuesta.
Pero creo que no me he explicado bien. Con esta consulta que me propones lo
que obtengo son las dos primeras filas de cada Departamento en la tabla
Personas.
Lo que me gustaría hacer y no sé como, es juntar esos dos registros en uno.

Algo así es lo que obtengo con la consulta que me propones:

Departamento1 Descripcion1 Nombre1 Apellido1
Departamento1 Descripcion1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1
Departamento2 Descripcion2 Nombre2 Apellido2
Departamento3 Descripcion3 Nombre1 Apellido1
Departamento3 Descripcion3 Nombre2 Apellido2

Algo así es lo que me gustaría obtener:

Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2

"Alejandro Mesa" wrote:

> Paco,
>
> Perfecto. Entonces puedes usar la siguiente sentencia.
>
> select
> d.Departemento,
> d.Descripcion,
> p.Nombre,
> p.Apellido1,
> p.Apellido2
> from
> dbo.Departamentos as d
> inner join
> dbo.Personas as p
> on d.Departamento = p.Departemento
> where
> p.Numero in (
> select top 2 p1.Numero
> from dbo.Personas as p1
> where p1.Departamento = d.Departamento
> order by p1.Numero ASC
> )
> order by
> d.Departemento,
> p.Nombre,
> p.Apellido1,
> p.Apellido2
> go
>
>
> AMB
>
> "Paco" wrote:
>
> > Pues el criterio es simple los dos primeros que se encuentre en orden de
> > clave primaria
> >
> > "Alejandro Mesa" wrote:
> >
> > > Paco,
> > >
> > > Cual seria el criterio a usar para saber que esas dos personas son las dos
> > > primeras del departamento?
> > >
> > >
> > > AMB
> > >
> > > "Paco" wrote:
> > >
> > > > Hola a todos
> > > > Necesito hacer una consulta y no sé cual sería la mejor forma. Lo ideal para
> > > > mi seria una vista pero si tiene que ser un funcion pues también me iria
> > > > bien. Os explico la situación y a ver si alguien me puede ayudar.
> > > >
> > > > Tengo las siguientes tablas :
> > > >
> > > > Departamentos :
> > > > Departamento (k)
> > > > Descripcion
> > > >
> > > > Personas:
> > > > Departemento (k)
> > > > Numero (k)
> > > > Nombre
> > > > Apellido1
> > > > Apellido2
> > > >
> > > > El campo Numero de la tabla Personas no es consecutivo y puede no empezar
> > > > por 0, es decir, las filas pueden estar así:
> > > > Departamento1,2,nombre,apellido
> > > > Departamento1,4,nombre,apellido
> > > > Departamento2,1,nombre,apellido
> > > > Departemanto2,2,nombre,apellido
> > > >
> > > > Me gustaría obtener una consulta por departamento con las dos primeras
> > > > personas de cada departamento. Algo así:
> > > >
> > > > Departamento1 Descripcion1 Nombre1 Apellido1 Nombre2 Apellido2
> > > > Departamento2 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> > > > Departamento3 Descripcion2 Nombre1 Apellido1 Nombre2 Apellido2
> > > >
> > > > Muchas gracias a todos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida