Ayuda con un select

15/02/2007 - 17:06 por jpablos | Informe spam
Saludos

Tengo en una tabla los siguientes registros

empresa agencia cuenta mes anio
1 1 123 1 2006
1 1 123 2 2006
1 1 123 4 2006
1 1 123 5 2006


Y asi tengo 127 empresas cada una con su cuenta y los meses del año 2006 del
1 al 12, pero en determinadas empresas y en unas cuentas, se han saltado los
meses, por ejemplo del mes 2 se salto al mes 4, no existe el mes 3, como
puedo hacer un select que me devuelva el mes que falta y a que empresa y
cuenta pertenece

Gracias ..

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
15/02/2007 - 17:55 | Informe spam
jpablos,

Cual version de sql server usas?


AMB


"jpablos" wrote:


Saludos

Tengo en una tabla los siguientes registros

empresa agencia cuenta mes anio
1 1 123 1 2006
1 1 123 2 2006
1 1 123 4 2006
1 1 123 5 2006


Y asi tengo 127 empresas cada una con su cuenta y los meses del año 2006 del
1 al 12, pero en determinadas empresas y en unas cuentas, se han saltado los
meses, por ejemplo del mes 2 se salto al mes 4, no existe el mes 3, como
puedo hacer un select que me devuelva el mes que falta y a que empresa y
cuenta pertenece

Gracias ..
Respuesta Responder a este mensaje
#2 Alejandro Mesa
15/02/2007 - 18:28 | Informe spam
jpablos,

Una posible solucion para sql server 2005. Lo que hace es formar como debe
estar supuestamente si no hubiese fila faltante, osea combinacion de cada
empresa, agencia, cuenta por todos los años y meses comprendidos entre el
minimo año y el maximo año.

declare @min_y int
declare @max_y int

select @min_y = min(anio), @max_y = max(anio) from dbo.t1;

with
L0 as (select 1 as c1 union all select 1),
L1 as (select 1 as c1 from L0 as a cross join L0 as b),
L2 as (select 1 as c1 from L1 as a cross join L1 as b),
L3 as (select 1 as c1 from L2 as a cross join L2 as b),
L4 as (select 1 as c1 from L3 as a cross join L3 as b),
Numbers as (select row_number() over(order by c1) as Number from L4),
Years as (select t.y + (n.Number - 1) as y from (select @min_y) as t(y),
Numbers as n where t.y + (n.Number - 1) <= @max_y),
YearsMonths as (select Years.y, Months.m from Years cross join (select
Number as m from Numbers where Number < 13) as Months),
ComoDebeEstar as (select * from (select distinct empresa, agencia, cuenta
from dbo.t1) as c cross join YearsMonths)
select
a.*
from
ComoDebeEstar as a
left join
dbo.t1 as b
on a.empresa = b.empresa
and a.agencia = b.agencia
and a.cuenta = b.cuenta
and a.y = b.anio
and a.m = b.mes
where
b.empresa is null
and b.agencia is null
and b.cuenta is null
and b.anio is null
and b.mes is null
go


AMB


"Alejandro Mesa" wrote:

jpablos,

Cual version de sql server usas?


AMB


"jpablos" wrote:

>
> Saludos
>
> Tengo en una tabla los siguientes registros
>
> empresa agencia cuenta mes anio
> 1 1 123 1 2006
> 1 1 123 2 2006
> 1 1 123 4 2006
> 1 1 123 5 2006
>
>
> Y asi tengo 127 empresas cada una con su cuenta y los meses del año 2006 del
> 1 al 12, pero en determinadas empresas y en unas cuentas, se han saltado los
> meses, por ejemplo del mes 2 se salto al mes 4, no existe el mes 3, como
> puedo hacer un select que me devuelva el mes que falta y a que empresa y
> cuenta pertenece
>
> Gracias ..
Respuesta Responder a este mensaje
#3 jpablos
15/02/2007 - 21:34 | Informe spam
Yo uso sql server 2000

"Alejandro Mesa" wrote:

jpablos,

Una posible solucion para sql server 2005. Lo que hace es formar como debe
estar supuestamente si no hubiese fila faltante, osea combinacion de cada
empresa, agencia, cuenta por todos los años y meses comprendidos entre el
minimo año y el maximo año.

declare @min_y int
declare @max_y int

select @min_y = min(anio), @max_y = max(anio) from dbo.t1;

with
L0 as (select 1 as c1 union all select 1),
L1 as (select 1 as c1 from L0 as a cross join L0 as b),
L2 as (select 1 as c1 from L1 as a cross join L1 as b),
L3 as (select 1 as c1 from L2 as a cross join L2 as b),
L4 as (select 1 as c1 from L3 as a cross join L3 as b),
Numbers as (select row_number() over(order by c1) as Number from L4),
Years as (select t.y + (n.Number - 1) as y from (select @min_y) as t(y),
Numbers as n where t.y + (n.Number - 1) <= @max_y),
YearsMonths as (select Years.y, Months.m from Years cross join (select
Number as m from Numbers where Number < 13) as Months),
ComoDebeEstar as (select * from (select distinct empresa, agencia, cuenta
from dbo.t1) as c cross join YearsMonths)
select
a.*
from
ComoDebeEstar as a
left join
dbo.t1 as b
on a.empresa = b.empresa
and a.agencia = b.agencia
and a.cuenta = b.cuenta
and a.y = b.anio
and a.m = b.mes
where
b.empresa is null
and b.agencia is null
and b.cuenta is null
and b.anio is null
and b.mes is null
go


AMB


"Alejandro Mesa" wrote:

> jpablos,
>
> Cual version de sql server usas?
>
>
> AMB
>
>
> "jpablos" wrote:
>
> >
> > Saludos
> >
> > Tengo en una tabla los siguientes registros
> >
> > empresa agencia cuenta mes anio
> > 1 1 123 1 2006
> > 1 1 123 2 2006
> > 1 1 123 4 2006
> > 1 1 123 5 2006
> >
> >
> > Y asi tengo 127 empresas cada una con su cuenta y los meses del año 2006 del
> > 1 al 12, pero en determinadas empresas y en unas cuentas, se han saltado los
> > meses, por ejemplo del mes 2 se salto al mes 4, no existe el mes 3, como
> > puedo hacer un select que me devuelva el mes que falta y a que empresa y
> > cuenta pertenece
> >
> > Gracias ..
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida