Construcción de una QUERY

30/10/2006 - 17:49 por PedroJ | Informe spam
Hola, os agradecería enormemente que me ayudeis a construir una QUERY
con los siguientes requisitos:
Se hace sobre una tabla con los siguientes campos:
IdCobro
FechaCobro
ImporteCobro
NumeroContrato

Pues bien, necesito una vista con el IdCobro que corresponda al valor
más pequeño de FechaCobro para cada NumeroContrato, vamos, el IdCobro
del primer cobro realizado (atención, que no tiene por qué conincidir
con el IdCobro más bajo para cada NumeroContrato).

Gracias a todos y un saludo.
PedroJ.

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
31/10/2006 - 14:05 | Informe spam
PedroJ,

1. Por si alguien copia y pega sin comprobar, en la solucón 2, cambiar
donde pone max(c.FechaCobro) por min(c.FechaCobro).
2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
debe aparecer el que tenga el IDCobro más bajo de los que son de la
misma fecha (mira que complico las cosas).



No se porque me incline por usar la funcion de grupo MAX, si en las
especificaciones bien que pides por el minimo.

2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
debe aparecer el que tenga el IDCobro más bajo de los que son de la
misma fecha (mira que complico las cosas).



Trata:

select a.NumeroContrato, a.IDCobro
from dbo.t1 as a inner join dbo.t1 as b
on b.NumeroContrato = a.NumeroContrato
and
(
b.FechaCobro < a.FechaCobro
or
(b.FechaCobro = a.FechaCobro and b.IDCobro <= a.IDCobro)
)
group by a.NumeroContrato, a.IDCobro
having count(*) = 1
go


AMB

"PedroJ" wrote:

PERFECTO ALEJANDRO, muchas gracias, sólo un par de puntualizaciones.

1. Por si alguien copia y pega sin comprobar, en la solucón 2, cambiar
donde pone max(c.FechaCobro) por min(c.FechaCobro).
2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
debe aparecer el que tenga el IDCobro más bajo de los que son de la
misma fecha (mira que complico las cosas).

Lo dicho, muchas gracias y un saludo.

Pedro J.


Alejandro Mesa ha escrito:

> Trata:
>
> 1 -
>
> select a.*
> from dbo.t1 as a
> where not exists (
> select *
> from dbo.t1 as b
> where b.NumeroContrato = a.NumeroContrato
> and b.FechaCobro < a.FechaCobro
> )
> go
>
> 2 -
>
> select a.*
> from dbo.t1 as a inner join
> (
> select c.NumeroContrato, max(c.FechaCobro) as max_FechaCobro
> from dbo.t1 as c
> group by c.NumeroContrato
> ) as b
> on a.NumeroContrato = b.NumeroContrato
> and a.FechaCobro = b.max_FechaCobro
> go
>
>
> AMB
>
> "PedroJ" wrote:
>
> > CORRECCIÓN A LOS DATOS DADOS
> > Los ejemplos deben ser:
> > IdCobro FechaCobro ImporteCobro NumeroContrato
> > 1 10/01/2006 25 25
> > 2 30/05/2006 60 50
> > 3 01/01/2006 80 25
> > 4 20/06/2006 50 50
> >
> > Y el resultado debe ser:
> > IdCobro FechaCobro ImporteCobro NumeroContrato
> > 3 01/01/2006 80 25
> > 2 30/05/2006 60 50
> >
> > Perdón, una fecha la puse mal.
> >
> > Un saludo.
> > Pedro J.
> >
> >
> > PedroJ ha escrito:
> >
> > > A ver, no es complicada la explicación. Voy...
> > > Tabla:
> > > IdCobro: int
> > > FechaCobro : smalldatetime
> > > ImporteCobro: money
> > > NumeroContrato: int
> > >
> > > Ejemplo de datos:
> > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > 1 10/01/2006 25
> > > 25
> > > 2 30/05/2006 60
> > > 50
> > > 3 10/01/2006 80
> > > 25
> > > 4 20/06/2006 50
> > > 50
> > >
> > >
> > > Resultado deseado obtener:
> > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > 3 10/01/2006 80
> > > 25
> > > 2 30/05/2006 60
> > > 50
> > >
> > > Es decir, el primer cobro realizado (según FechaCobro) de cada
> > > contrato.
> > >
> > > Espero haberme explicado con mayor claridad.
> > >
> > > Un saludo.
> > > Pedro J.
> > >
> > >
> > >
> > > Maxi ha escrito:
> > >
> > > > Pedro, la verdad que es complicado ayudarte asi, podes pasarnos algun
> > > > detalle de datos y como deberia quedar la query? que tipo de datos son esos
> > > > que has mencionado?
> > > >
> > > >
> > > > Salu2
> > > >
> > > > Microsoft MVP SQL Server
> > > > Culminis Speaker
> > > > INETA Speaker
> > > >
> > > > "PedroJ" escribió en el mensaje
> > > > news:
> > > > Hola, os agradecería enormemente que me ayudeis a construir una QUERY
> > > > con los siguientes requisitos:
> > > > Se hace sobre una tabla con los siguientes campos:
> > > > IdCobro
> > > > FechaCobro
> > > > ImporteCobro
> > > > NumeroContrato
> > > >
> > > > Pues bien, necesito una vista con el IdCobro que corresponda al valor
> > > > más pequeño de FechaCobro para cada NumeroContrato, vamos, el IdCobro
> > > > del primer cobro realizado (atención, que no tiene por qué conincidir
> > > > con el IdCobro más bajo para cada NumeroContrato).
> > > >
> > > > Gracias a todos y un saludo.
> > > > PedroJ.
> >
> >


Respuesta Responder a este mensaje
#7 PedroJ
31/10/2006 - 17:04 | Informe spam
Chiquillo.. ERES UN MONSTRUO... OLE tus querys...

Muchísimas gracias, la verdad, no se me hubiera ocurrido hacerlo a mi.


Un saludo.

Pedro J..

Alejandro Mesa ha escrito:

PedroJ,

> 1. Por si alguien copia y pega sin comprobar, en la solucón 2, cambiar
> donde pone max(c.FechaCobro) por min(c.FechaCobro).
> 2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
> suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
> debe aparecer el que tenga el IDCobro más bajo de los que son de la
> misma fecha (mira que complico las cosas).

No se porque me incline por usar la funcion de grupo MAX, si en las
especificaciones bien que pides por el minimo.

> 2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
> suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
> debe aparecer el que tenga el IDCobro más bajo de los que son de la
> misma fecha (mira que complico las cosas).

Trata:

select a.NumeroContrato, a.IDCobro
from dbo.t1 as a inner join dbo.t1 as b
on b.NumeroContrato = a.NumeroContrato
and
(
b.FechaCobro < a.FechaCobro
or
(b.FechaCobro = a.FechaCobro and b.IDCobro <= a.IDCobro)
)
group by a.NumeroContrato, a.IDCobro
having count(*) = 1
go


AMB

"PedroJ" wrote:

> PERFECTO ALEJANDRO, muchas gracias, sólo un par de puntualizaciones.
>
> 1. Por si alguien copia y pega sin comprobar, en la solucón 2, cambiar
> donde pone max(c.FechaCobro) por min(c.FechaCobro).
> 2. Un problema adicional ("mea culpa", no lo especifiqué). Puede
> suceder que haya DOS O MÁS cobros con la misma fecha, en cuyo caso
> debe aparecer el que tenga el IDCobro más bajo de los que son de la
> misma fecha (mira que complico las cosas).
>
> Lo dicho, muchas gracias y un saludo.
>
> Pedro J.
>
>
> Alejandro Mesa ha escrito:
>
> > Trata:
> >
> > 1 -
> >
> > select a.*
> > from dbo.t1 as a
> > where not exists (
> > select *
> > from dbo.t1 as b
> > where b.NumeroContrato = a.NumeroContrato
> > and b.FechaCobro < a.FechaCobro
> > )
> > go
> >
> > 2 -
> >
> > select a.*
> > from dbo.t1 as a inner join
> > (
> > select c.NumeroContrato, max(c.FechaCobro) as max_FechaCobro
> > from dbo.t1 as c
> > group by c.NumeroContrato
> > ) as b
> > on a.NumeroContrato = b.NumeroContrato
> > and a.FechaCobro = b.max_FechaCobro
> > go
> >
> >
> > AMB
> >
> > "PedroJ" wrote:
> >
> > > CORRECCIÓN A LOS DATOS DADOS
> > > Los ejemplos deben ser:
> > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > 1 10/01/2006 25 25
> > > 2 30/05/2006 60 50
> > > 3 01/01/2006 80 25
> > > 4 20/06/2006 50 50
> > >
> > > Y el resultado debe ser:
> > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > 3 01/01/2006 80 25
> > > 2 30/05/2006 60 50
> > >
> > > Perdón, una fecha la puse mal.
> > >
> > > Un saludo.
> > > Pedro J.
> > >
> > >
> > > PedroJ ha escrito:
> > >
> > > > A ver, no es complicada la explicación. Voy...
> > > > Tabla:
> > > > IdCobro: int
> > > > FechaCobro : smalldatetime
> > > > ImporteCobro: money
> > > > NumeroContrato: int
> > > >
> > > > Ejemplo de datos:
> > > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > > 1 10/01/2006 25
> > > > 25
> > > > 2 30/05/2006 60
> > > > 50
> > > > 3 10/01/2006 80
> > > > 25
> > > > 4 20/06/2006 50
> > > > 50
> > > >
> > > >
> > > > Resultado deseado obtener:
> > > > IdCobro FechaCobro ImporteCobro NumeroContrato
> > > > 3 10/01/2006 80
> > > > 25
> > > > 2 30/05/2006 60
> > > > 50
> > > >
> > > > Es decir, el primer cobro realizado (según FechaCobro) de cada
> > > > contrato.
> > > >
> > > > Espero haberme explicado con mayor claridad.
> > > >
> > > > Un saludo.
> > > > Pedro J.
> > > >
> > > >
> > > >
> > > > Maxi ha escrito:
> > > >
> > > > > Pedro, la verdad que es complicado ayudarte asi, podes pasarnos algun
> > > > > detalle de datos y como deberia quedar la query? que tipo de datos son esos
> > > > > que has mencionado?
> > > > >
> > > > >
> > > > > Salu2
> > > > >
> > > > > Microsoft MVP SQL Server
> > > > > Culminis Speaker
> > > > > INETA Speaker
> > > > >
> > > > > "PedroJ" escribió en el mensaje
> > > > > news:
> > > > > Hola, os agradecería enormemente que me ayudeis a construir una QUERY
> > > > > con los siguientes requisitos:
> > > > > Se hace sobre una tabla con los siguientes campos:
> > > > > IdCobro
> > > > > FechaCobro
> > > > > ImporteCobro
> > > > > NumeroContrato
> > > > >
> > > > > Pues bien, necesito una vista con el IdCobro que corresponda al valor
> > > > > más pequeño de FechaCobro para cada NumeroContrato, vamos, el IdCobro
> > > > > del primer cobro realizado (atención, que no tiene por qué conincidir
> > > > > con el IdCobro más bajo para cada NumeroContrato).
> > > > >
> > > > > Gracias a todos y un saludo.
> > > > > PedroJ.
> > >
> > >
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida