Ayuda con consulta....

02/10/2004 - 00:13 por Eusebio | Informe spam
Hola grupo,

estoy tratando de solucionar el sisguiente problema:


/*

Lo que se quiere es obtener una tabla que muestre
los intervalos en los cuales los registros se encuentran
marcados con la letra E (Estado = E )
Por ejemplo: del número 4 al 9 los registros se encuentran
marcados con estado "E" y además son consecutivos
osea que se insertarían en la tabla
Pero del 2 al 3, como el estado es "P" no se insertarían en la tabla.

La tabla entonces se vería asi:
=Inicial -- Final
=1 -- 1
4 -- 9
13 -- 13
17 -- 20
=
*/



Mil gracias por sus comentarios.
Eusebio M


El script de test es el siguiente:

create table #TestRangos ( Consecutivo int , Estado char(10) )

insert into #TestRangos VALUES ( 1 , 'P')
insert into #TestRangos VALUES ( 2 , 'E')
insert into #TestRangos VALUES ( 3 , 'E')
insert into #TestRangos VALUES ( 4 , 'P')
insert into #TestRangos VALUES ( 5 , 'P')
insert into #TestRangos VALUES ( 6 , 'P')
insert into #TestRangos VALUES ( 7 , 'P')
insert into #TestRangos VALUES ( 8 , 'P')
insert into #TestRangos VALUES ( 9 , 'P')
insert into #TestRangos VALUES ( 10 , 'E')
insert into #TestRangos VALUES ( 11 , 'E')
insert into #TestRangos VALUES ( 12 , 'E')
insert into #TestRangos VALUES ( 13 , 'P')
insert into #TestRangos VALUES ( 14 , 'E')
insert into #TestRangos VALUES ( 15 , 'E')
insert into #TestRangos VALUES ( 16 , 'E')
insert into #TestRangos VALUES ( 17 , 'P')
insert into #TestRangos VALUES ( 18 , 'P')
insert into #TestRangos VALUES ( 19 , 'P')
insert into #TestRangos VALUES ( 20 , 'P')


SELECT * FROM #TestRangos

Preguntas similare

Leer las respuestas

#1 qwalgrande
02/10/2004 - 01:33 | Informe spam
Hola.

Te propongo el siguiente mecanismo para rellenar la tabla de rangos

create table #Rangos (Inicial int, Final int)

declare @ini int, @fin int, @consec int, @estado char(1)
declare cur cursor for
select * from #TestRangos order by consecutivo

open cur

fetch next from cur into @consec, @estado
while @@fetch_status = 0
begin
if @estado = 'p'
begin
if exists (select * from #Rangos where Inicial = @ini)
update #Rangos set final = @consec where inicial = @ini
else
begin
insert #Rangos values (@consec, @consec)
select @ini = @consec
end
end
else
select @ini = 0
fetch next from cur into @consec, @estado
end

deallocate cur

select * from #Rangos


Espero que al menos te sirva como base y que puedas perfeccionarlo para
solventar tu problema.

qwalgrande

"Eusebio" wrote:

Hola grupo,

estoy tratando de solucionar el sisguiente problema:


/*

Lo que se quiere es obtener una tabla que muestre
los intervalos en los cuales los registros se encuentran
marcados con la letra E (Estado = E )
Por ejemplo: del número 4 al 9 los registros se encuentran
marcados con estado "E" y además son consecutivos
osea que se insertarían en la tabla
Pero del 2 al 3, como el estado es "P" no se insertarían en la tabla.

La tabla entonces se vería asi:
=> Inicial -- Final
=> 1 -- 1
4 -- 9
13 -- 13
17 -- 20
=>
*/



Mil gracias por sus comentarios.
Eusebio M


El script de test es el siguiente:

create table #TestRangos ( Consecutivo int , Estado char(10) )

insert into #TestRangos VALUES ( 1 , 'P')
insert into #TestRangos VALUES ( 2 , 'E')
insert into #TestRangos VALUES ( 3 , 'E')
insert into #TestRangos VALUES ( 4 , 'P')
insert into #TestRangos VALUES ( 5 , 'P')
insert into #TestRangos VALUES ( 6 , 'P')
insert into #TestRangos VALUES ( 7 , 'P')
insert into #TestRangos VALUES ( 8 , 'P')
insert into #TestRangos VALUES ( 9 , 'P')
insert into #TestRangos VALUES ( 10 , 'E')
insert into #TestRangos VALUES ( 11 , 'E')
insert into #TestRangos VALUES ( 12 , 'E')
insert into #TestRangos VALUES ( 13 , 'P')
insert into #TestRangos VALUES ( 14 , 'E')
insert into #TestRangos VALUES ( 15 , 'E')
insert into #TestRangos VALUES ( 16 , 'E')
insert into #TestRangos VALUES ( 17 , 'P')
insert into #TestRangos VALUES ( 18 , 'P')
insert into #TestRangos VALUES ( 19 , 'P')
insert into #TestRangos VALUES ( 20 , 'P')


SELECT * FROM #TestRangos



Respuesta Responder a este mensaje
#2 Miguel Egea
02/10/2004 - 19:37 | Informe spam
Lo que dice qwAlgrande es correcto, pero yo soy de la brigada
anticursores,...
A pesar de que esta tarde estoy un poco espeso (el vino de la comisa
supongo) he creado este script que hace lo mismo sin cursores, me he
complicado un poco de más ,creo que se pueden evitar subselects, pero bueno
la idea es lo que vale ..



select *,
( Select min ( consecutivo) consecutivo from (select t2.consecutivo
consecutivo from #testrangos t right join #testrangos t2 on
t.consecutivo=t2.consecutivo+1
where t.estado<>'P' AND T2.estado='P'
union
Select max(consecutivo) consecutivo from #testRangos where estado='P') a
where a.consecutivo>=t.consecutivo

)
from (
Select min(consecutivo) consecutivo from #testRangos where estado='P'
union
select t.consecutivo from #testrangos t right join #testrangos t2 on
t.consecutivo-1=t2.consecutivo
where t.estado='P' AND T2.estado<>'P'
) t

"Eusebio" escribió en el mensaje
news:
Hola grupo,

estoy tratando de solucionar el sisguiente problema:


/*

Lo que se quiere es obtener una tabla que muestre
los intervalos en los cuales los registros se encuentran
marcados con la letra E (Estado = E )
Por ejemplo: del número 4 al 9 los registros se encuentran
marcados con estado "E" y además son consecutivos
osea que se insertarían en la tabla
Pero del 2 al 3, como el estado es "P" no se insertarían en la tabla.

La tabla entonces se vería asi:
=> Inicial -- Final
=> 1 -- 1
4 -- 9
13 -- 13
17 -- 20
=>
*/



Mil gracias por sus comentarios.
Eusebio M


El script de test es el siguiente:

create table #TestRangos ( Consecutivo int , Estado char(10) )

insert into #TestRangos VALUES ( 1 , 'P')
insert into #TestRangos VALUES ( 2 , 'E')
insert into #TestRangos VALUES ( 3 , 'E')
insert into #TestRangos VALUES ( 4 , 'P')
insert into #TestRangos VALUES ( 5 , 'P')
insert into #TestRangos VALUES ( 6 , 'P')
insert into #TestRangos VALUES ( 7 , 'P')
insert into #TestRangos VALUES ( 8 , 'P')
insert into #TestRangos VALUES ( 9 , 'P')
insert into #TestRangos VALUES ( 10 , 'E')
insert into #TestRangos VALUES ( 11 , 'E')
insert into #TestRangos VALUES ( 12 , 'E')
insert into #TestRangos VALUES ( 13 , 'P')
insert into #TestRangos VALUES ( 14 , 'E')
insert into #TestRangos VALUES ( 15 , 'E')
insert into #TestRangos VALUES ( 16 , 'E')
insert into #TestRangos VALUES ( 17 , 'P')
insert into #TestRangos VALUES ( 18 , 'P')
insert into #TestRangos VALUES ( 19 , 'P')
insert into #TestRangos VALUES ( 20 , 'P')


SELECT * FROM #TestRangos


Respuesta Responder a este mensaje
#3 Javier Loria
02/10/2004 - 22:21 | Informe spam
Hola:
Una alternativa a la propuesta de Miguel Egea sin subconsultas, pero muy
complicada:
==SELECT Inicio, MAX(Final) AS Final
FROM (
SELECT Inicio.Consecutivo AS Inicio
, Final.Consecutivo AS Final
FROM TestRangos AS Inicio
LEFT JOIN TestRangos AS Siguiente
ON Inicio.Consecutivo=Siguiente.Consecutivo+1
JOIN TestRangos AS Final
ON Inicio.Consecutivo<=Final.Consecutivo
JOIN TestRangos AS Rango
ON Inicio.Consecutivo<=Rango.Consecutivo
AND Rango.Consecutivo<=Final.Consecutivo
WHERE Siguiente.Consecutivo IS NULL
OR Inicio.Estado<>Siguiente.Estado
AND Inicio.Estado<>'E'
GROUP BY Inicio.Consecutivo
, Final.Consecutivo
HAVING (1+Final.Consecutivo-Inicio.Consecutivo) SUM(CASE WHEN Rango.Estado='P' THEN 1 ELSE 0 END))
AS F
GROUP BY Inicio
= Si lo implementas documentala extensamente, porque es dificil de
entender ya que tiene muchas "tecnicas" juntas.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Eusebio" wrote in message
news:
Hola grupo,

estoy tratando de solucionar el sisguiente problema:


/*

Lo que se quiere es obtener una tabla que muestre
los intervalos en los cuales los registros se encuentran
marcados con la letra E (Estado = E )
Por ejemplo: del número 4 al 9 los registros se encuentran
marcados con estado "E" y además son consecutivos
osea que se insertarían en la tabla
Pero del 2 al 3, como el estado es "P" no se insertarían en la tabla.

La tabla entonces se vería asi:
=> Inicial -- Final
=> 1 -- 1
4 -- 9
13 -- 13
17 -- 20
=>
*/



Mil gracias por sus comentarios.
Eusebio M


El script de test es el siguiente:

create table #TestRangos ( Consecutivo int , Estado char(10) )

insert into #TestRangos VALUES ( 1 , 'P')
insert into #TestRangos VALUES ( 2 , 'E')
insert into #TestRangos VALUES ( 3 , 'E')
insert into #TestRangos VALUES ( 4 , 'P')
insert into #TestRangos VALUES ( 5 , 'P')
insert into #TestRangos VALUES ( 6 , 'P')
insert into #TestRangos VALUES ( 7 , 'P')
insert into #TestRangos VALUES ( 8 , 'P')
insert into #TestRangos VALUES ( 9 , 'P')
insert into #TestRangos VALUES ( 10 , 'E')
insert into #TestRangos VALUES ( 11 , 'E')
insert into #TestRangos VALUES ( 12 , 'E')
insert into #TestRangos VALUES ( 13 , 'P')
insert into #TestRangos VALUES ( 14 , 'E')
insert into #TestRangos VALUES ( 15 , 'E')
insert into #TestRangos VALUES ( 16 , 'E')
insert into #TestRangos VALUES ( 17 , 'P')
insert into #TestRangos VALUES ( 18 , 'P')
insert into #TestRangos VALUES ( 19 , 'P')
insert into #TestRangos VALUES ( 20 , 'P')


SELECT * FROM #TestRangos


Respuesta Responder a este mensaje
#4 Eusebio
04/10/2004 - 22:16 | Informe spam
mil gracias a todos...


Eusebio M





"Eusebio" escribió en el mensaje
news:
Hola grupo,

estoy tratando de solucionar el sisguiente problema:


/*

Lo que se quiere es obtener una tabla que muestre
los intervalos en los cuales los registros se encuentran
marcados con la letra E (Estado = E )
Por ejemplo: del número 4 al 9 los registros se encuentran
marcados con estado "E" y además son consecutivos
osea que se insertarían en la tabla
Pero del 2 al 3, como el estado es "P" no se insertarían en la tabla.

La tabla entonces se vería asi:
=> Inicial -- Final
=> 1 -- 1
4 -- 9
13 -- 13
17 -- 20
=>
*/



Mil gracias por sus comentarios.
Eusebio M


El script de test es el siguiente:

create table #TestRangos ( Consecutivo int , Estado char(10) )

insert into #TestRangos VALUES ( 1 , 'P')
insert into #TestRangos VALUES ( 2 , 'E')
insert into #TestRangos VALUES ( 3 , 'E')
insert into #TestRangos VALUES ( 4 , 'P')
insert into #TestRangos VALUES ( 5 , 'P')
insert into #TestRangos VALUES ( 6 , 'P')
insert into #TestRangos VALUES ( 7 , 'P')
insert into #TestRangos VALUES ( 8 , 'P')
insert into #TestRangos VALUES ( 9 , 'P')
insert into #TestRangos VALUES ( 10 , 'E')
insert into #TestRangos VALUES ( 11 , 'E')
insert into #TestRangos VALUES ( 12 , 'E')
insert into #TestRangos VALUES ( 13 , 'P')
insert into #TestRangos VALUES ( 14 , 'E')
insert into #TestRangos VALUES ( 15 , 'E')
insert into #TestRangos VALUES ( 16 , 'E')
insert into #TestRangos VALUES ( 17 , 'P')
insert into #TestRangos VALUES ( 18 , 'P')
insert into #TestRangos VALUES ( 19 , 'P')
insert into #TestRangos VALUES ( 20 , 'P')


SELECT * FROM #TestRangos


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