Obtener el maximo grupo

29/08/2005 - 22:34 por Eduardo De Luca | Informe spam
Que tal como están .



Tengo la el siguiente problema y hasta ahora no he podido resolverlo sin el
uso de cursores , se que se tiene que poder resolver sin el uso de los
mismos así que acudo a la ayuda de ud



Problema :



En una tabla tengo dos campos : numero de cliente , importe



Entonces



Numerocte importe



10 0

10 0 _______________

10 36

10 95_______________2 dias de mora

10 0

10 0 _______________

10 20

10 20

10 20 ______________3 dias de mora

10 0 _______________

10 20

10 20

10 26

10 26_______________4 dias de mora





El tema es cuando el cliente deja de estar "deudor (saldo 0)" se produce un
corte. Lo que tengo que hacer es agrupar por grupos de días -No los puedo
juntar- . En el ejemplo dado tengo 3 grupos con 2 , 3 y 4 dias de esos
tres grupos tengo que elegir el mayor es decir "4" dias de mora.

Alguno me podría ayudar a como realizarlo sin cursores.



Muchas gracias

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
30/08/2005 - 15:09 | Informe spam
Eduardo,

Una sola pregunta tengo para ti y esta es la sgte:

Cual es el criterio que podemos usar para saber el orden cronologico de las
filas dentro de la tabla?. Existe alguna columna cuyo valor se incrementa o
que sea tipo datetime que podamos usar?, en otras palabras, como sabemos que
10, 36 va despues del segundo 10, 0 (digo segundo porque lo veo, pero en sql
server no hay un orden fisico determinado de las filas en una tabla).

Voy a poner un ejemplo de como hacerlo, pero voy a suponer que tenemos una
columna con propiedad identity que me sirva como referencia para saber el
orden de las filas. Estoy usando vistas para hacer el codigo mas legible.

create table t1 (
c1 int not null identity unique,
numerocte int not null,
importe numeric(17, 2) not null
)
go

insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 36)
insert into t1(numerocte, importe) values(10, 95)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 26)
insert into t1(numerocte, importe) values(10, 26)
go

create view v1
as
select
(
select
coalesce(max(b.c1), a.c1)
from
t1 as b
where
b.c1 > a.c1
and b.importe != 0
and not exists (
select
*
from
t1 as c
where
c.c1 > a.c1 and c.c1 < b.c1 and c.importe = 0
)
) as rank
from
t1 as a
where
a.importe != 0
go

create view v2
as
select
rank,
count(*) as dias
from
v1
group by
rank
go

select
count(distinct b.rank) as grupo,
max(a.dias) as dias
from
v2 as a
inner join
v2 as b
on a.rank >= b.rank
group by
a.rank
order by
grupo
go

drop view v2, v1
go

drop table t1
go


AMB

"Eduardo De Luca" wrote:

Si el saldo cero es un dia .
La extructura es :el cliente int , importe numeric (17.2).
La estructura esta resumida para no complicarla mas . El resultado que yo
espero obtener de esta consulta (para el ej que pongo abajo) es :

cliente 10 tres grupos de dias de mora (no me interesa el monto si los
dias ) entonces el resultado seria

grupo 1 2 dias
grupo 2 3 dias
grupo 3 4 dias

se entiende por dia de mora a aquellos que son mayor a cero , cuando el
saldo es igual a cero la cta esta saldada.

Cualquier cosa me avisas

Como siempre gracias por tu ayuda.


Fijate que la linea de puntos la pongo como para hacer notar donde se
produce el corte

"Maxi" escribió en el mensaje
news:
> Hola, el saldo 0 es un registro y cada registro es un dia? podrias pasar
> la estructura de tablas ?
>
>
> Salu2
> Maxi
>
>
> "Eduardo De Luca" escribió en el mensaje
> news:%
>> Es el resultado del agrupamiento , fijate que cuando queda en saldo cero
>> se empieza a contar de nuevo
>>
>>
>>
>> "Maxi" escribió en el mensaje
>> news:eSy%
>>> Hola y los dias de demora de donde lo sacas?
>>>
>>>
>>> Salu2
>>> Maxi
>>>
>>>
>>> "Eduardo De Luca" escribió en el mensaje
>>> news:
>>>> Que tal como están .
>>>>
>>>>
>>>>
>>>> Tengo la el siguiente problema y hasta ahora no he podido resolverlo
>>>> sin el uso de cursores , se que se tiene que poder resolver sin el uso
>>>> de los mismos así que acudo a la ayuda de ud
>>>>
>>>>
>>>>
>>>> Problema :
>>>>
>>>>
>>>>
>>>> En una tabla tengo dos campos : numero de cliente , importe
>>>>
>>>>
>>>>
>>>> Entonces
>>>>
>>>>
>>>>
>>>> Numerocte importe
>>>>
>>>>
>>>>
>>>> 10 0
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 36
>>>>
>>>> 10 95_______________2 dias de mora
>>>>
>>>> 10 0
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 20
>>>>
>>>> 10 20
>>>>
>>>> 10 20 ______________3 dias de mora
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 20
>>>>
>>>> 10 20
>>>>
>>>> 10 26
>>>>
>>>> 10 26_______________4 dias de mora
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> El tema es cuando el cliente deja de estar "deudor (saldo 0)" se
>>>> produce un corte. Lo que tengo que hacer es agrupar por grupos de
>>>> días -No los puedo juntar- . En el ejemplo dado tengo 3 grupos con 2 ,
>>>> 3 y 4 dias de esos tres grupos tengo que elegir el mayor es decir "4"
>>>> dias de mora.
>>>>
>>>> Alguno me podría ayudar a como realizarlo sin cursores.
>>>>
>>>>
>>>>
>>>> Muchas gracias
>>>>
>>>>
>>>
>>>
>>
>>
>
>



Respuesta Responder a este mensaje
#7 Eduardo De Luca
30/08/2005 - 15:09 | Informe spam
Hagamos asi , tenes el sgte caso tabla A con los sgtes registros

A 1
A 1
B 0
A 1
A 1
A 1

El resultado que yo espero obtener es elemento A : 2 unidades de 1 ,
elemento A : 3 unidades de 2

esta consulta con un group by el resultado que arrojaria serian 5 elementos
de 1 y no me sirve , porque justo lo que que quiero producir es un "corte "
cuano el saldo es 0 (en el caso del ejemplo el elemento B)



"Maxi" escribió en el mensaje
news:O$z$
Sigo sin comprenderte :( lo que yo veo son los importes pero el saldo no
lo veo!! podrias ser un poco mas especifico ?


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Eduardo De Luca" escribió en el mensaje
news:
Si el saldo cero es un dia .
La extructura es :el cliente int , importe numeric (17.2).
La estructura esta resumida para no complicarla mas . El resultado que yo
espero obtener de esta consulta (para el ej que pongo abajo) es :

cliente 10 tres grupos de dias de mora (no me interesa el monto si los
dias ) entonces el resultado seria

grupo 1 2 dias
grupo 2 3 dias
grupo 3 4 dias

se entiende por dia de mora a aquellos que son mayor a cero , cuando el
saldo es igual a cero la cta esta saldada.

Cualquier cosa me avisas

Como siempre gracias por tu ayuda.


Fijate que la linea de puntos la pongo como para hacer notar donde se
produce el corte

"Maxi" escribió en el mensaje
news:
Hola, el saldo 0 es un registro y cada registro es un dia? podrias pasar
la estructura de tablas ?


Salu2
Maxi


"Eduardo De Luca" escribió en el mensaje
news:%
Es el resultado del agrupamiento , fijate que cuando queda en saldo
cero se empieza a contar de nuevo



"Maxi" escribió en el mensaje
news:eSy%
Hola y los dias de demora de donde lo sacas?


Salu2
Maxi


"Eduardo De Luca" escribió en el mensaje
news:
Que tal como están .



Tengo la el siguiente problema y hasta ahora no he podido resolverlo
sin el uso de cursores , se que se tiene que poder resolver sin el
uso de los mismos así que acudo a la ayuda de ud



Problema :



En una tabla tengo dos campos : numero de cliente , importe



Entonces



Numerocte importe



10 0

10 0 _______________

10 36

10 95_______________2 dias de mora

10 0

10 0 _______________

10 20

10 20

10 20 ______________3 dias de mora

10 0 _______________

10 20

10 20

10 26

10 26_______________4 dias de mora





El tema es cuando el cliente deja de estar "deudor (saldo 0)" se
produce un corte. Lo que tengo que hacer es agrupar por grupos de
días -No los puedo juntar- . En el ejemplo dado tengo 3 grupos con 2
, 3 y 4 dias de esos tres grupos tengo que elegir el mayor es decir
"4" dias de mora.

Alguno me podría ayudar a como realizarlo sin cursores.



Muchas gracias






















Respuesta Responder a este mensaje
#8 Eduardo De Luca
30/08/2005 - 16:24 | Informe spam
Alejandro antes que nada , como siempre muchas gracias por tu atencion.
En virtud a tu pregunta , si podemos agregar las colummas que creeas
necesarias , no hay problema



"Alejandro Mesa" escribió en el
mensaje news:
Eduardo,

Una sola pregunta tengo para ti y esta es la sgte:

Cual es el criterio que podemos usar para saber el orden cronologico de
las
filas dentro de la tabla?. Existe alguna columna cuyo valor se incrementa
o
que sea tipo datetime que podamos usar?, en otras palabras, como sabemos
que
10, 36 va despues del segundo 10, 0 (digo segundo porque lo veo, pero en
sql
server no hay un orden fisico determinado de las filas en una tabla).

Voy a poner un ejemplo de como hacerlo, pero voy a suponer que tenemos una
columna con propiedad identity que me sirva como referencia para saber el
orden de las filas. Estoy usando vistas para hacer el codigo mas legible.

create table t1 (
c1 int not null identity unique,
numerocte int not null,
importe numeric(17, 2) not null
)
go

insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 36)
insert into t1(numerocte, importe) values(10, 95)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 0)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 20)
insert into t1(numerocte, importe) values(10, 26)
insert into t1(numerocte, importe) values(10, 26)
go

create view v1
as
select
(
select
coalesce(max(b.c1), a.c1)
from
t1 as b
where
b.c1 > a.c1
and b.importe != 0
and not exists (
select
*
from
t1 as c
where
c.c1 > a.c1 and c.c1 < b.c1 and c.importe = 0
)
) as rank
from
t1 as a
where
a.importe != 0
go

create view v2
as
select
rank,
count(*) as dias
from
v1
group by
rank
go

select
count(distinct b.rank) as grupo,
max(a.dias) as dias
from
v2 as a
inner join
v2 as b
on a.rank >= b.rank
group by
a.rank
order by
grupo
go

drop view v2, v1
go

drop table t1
go


AMB

"Eduardo De Luca" wrote:

Si el saldo cero es un dia .
La extructura es :el cliente int , importe numeric (17.2).
La estructura esta resumida para no complicarla mas . El resultado que yo
espero obtener de esta consulta (para el ej que pongo abajo) es :

cliente 10 tres grupos de dias de mora (no me interesa el monto si los
dias ) entonces el resultado seria

grupo 1 2 dias
grupo 2 3 dias
grupo 3 4 dias

se entiende por dia de mora a aquellos que son mayor a cero , cuando el
saldo es igual a cero la cta esta saldada.

Cualquier cosa me avisas

Como siempre gracias por tu ayuda.


Fijate que la linea de puntos la pongo como para hacer notar donde se
produce el corte

"Maxi" escribió en el mensaje
news:
> Hola, el saldo 0 es un registro y cada registro es un dia? podrias
> pasar
> la estructura de tablas ?
>
>
> Salu2
> Maxi
>
>
> "Eduardo De Luca" escribió en el mensaje
> news:%
>> Es el resultado del agrupamiento , fijate que cuando queda en saldo
>> cero
>> se empieza a contar de nuevo
>>
>>
>>
>> "Maxi" escribió en el mensaje
>> news:eSy%
>>> Hola y los dias de demora de donde lo sacas?
>>>
>>>
>>> Salu2
>>> Maxi
>>>
>>>
>>> "Eduardo De Luca" escribió en el mensaje
>>> news:
>>>> Que tal como están .
>>>>
>>>>
>>>>
>>>> Tengo la el siguiente problema y hasta ahora no he podido
>>>> resolverlo
>>>> sin el uso de cursores , se que se tiene que poder resolver sin el
>>>> uso
>>>> de los mismos así que acudo a la ayuda de ud
>>>>
>>>>
>>>>
>>>> Problema :
>>>>
>>>>
>>>>
>>>> En una tabla tengo dos campos : numero de cliente , importe
>>>>
>>>>
>>>>
>>>> Entonces
>>>>
>>>>
>>>>
>>>> Numerocte importe
>>>>
>>>>
>>>>
>>>> 10 0
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 36
>>>>
>>>> 10 95_______________2 dias de mora
>>>>
>>>> 10 0
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 20
>>>>
>>>> 10 20
>>>>
>>>> 10 20 ______________3 dias de mora
>>>>
>>>> 10 0 _______________
>>>>
>>>> 10 20
>>>>
>>>> 10 20
>>>>
>>>> 10 26
>>>>
>>>> 10 26_______________4 dias de mora
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> El tema es cuando el cliente deja de estar "deudor (saldo 0)" se
>>>> produce un corte. Lo que tengo que hacer es agrupar por grupos de
>>>> días -No los puedo juntar- . En el ejemplo dado tengo 3 grupos con
>>>> 2 ,
>>>> 3 y 4 dias de esos tres grupos tengo que elegir el mayor es decir
>>>> "4"
>>>> dias de mora.
>>>>
>>>> Alguno me podría ayudar a como realizarlo sin cursores.
>>>>
>>>>
>>>>
>>>> Muchas gracias
>>>>
>>>>
>>>
>>>
>>
>>
>
>



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