Calcular acumulados con T-SQL

08/04/2004 - 17:51 por Matín López | Informe spam
¿Alguien sabes como puedo resolver esto SIN utilizar cursores?

Tengo la siguiente tabla:

Cliente Monto
A 100
B 50
C 25
D 10

Necesito devolver una columna adicional con los acumulados del monto, de
esta manera:

Cliente Monto Acumulado
A 100 100
B 50 150
C 25 175
D 10 185


Gracias.

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
08/04/2004 - 19:38 | Informe spam
Hola, suponiendo que no hay dos clientes iguales aca te mando el ejemplo:

CREATE TABLE #PEPE (ID CHAR(30), MONTO INT)

INSERT INTO #PEPE VALUES('A','100')
INSERT INTO #PEPE VALUES('B','50')
INSERT INTO #PEPE VALUES('C','25')
INSERT INTO #PEPE VALUES('D','10')

SELECT id, monto,
(SELECT sum(monto) FROM #pepe e2 WHERE e2.id <= e.id) AS acumulado
FROM #pepe e
ORDER BY id


Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Matín López" escribió en el mensaje
news:
¿Alguien sabes como puedo resolver esto SIN utilizar cursores?

Tengo la siguiente tabla:

Cliente Monto
A 100
B 50
C 25
D 10

Necesito devolver una columna adicional con los acumulados del monto, de
esta manera:

Cliente Monto Acumulado
A 100 100
B 50 150
C 25 175
D 10 185


Gracias.







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
Respuesta Responder a este mensaje
#2 Martín López
08/04/2004 - 21:27 | Informe spam
Este caso funciona si los id de clientes estan en orden alfabetico, en el
caso que tengo que resolver están ordenados por monto. Te paso un ejemplo:

Cliente Monto
D 100
B 50
C 25
A 10

Resultado:

Cliente Monto Acumulado
D 100 100
B 50 150
C 25 175
A 10 185

Muchas gracias.

"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:#
Hola, suponiendo que no hay dos clientes iguales aca te mando el ejemplo:

CREATE TABLE #PEPE (ID CHAR(30), MONTO INT)

INSERT INTO #PEPE VALUES('A','100')
INSERT INTO #PEPE VALUES('B','50')
INSERT INTO #PEPE VALUES('C','25')
INSERT INTO #PEPE VALUES('D','10')

SELECT id, monto,
(SELECT sum(monto) FROM #pepe e2 WHERE e2.id <= e.id) AS acumulado
FROM #pepe e
ORDER BY id


Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Matín López" escribió en el mensaje
news:
> ¿Alguien sabes como puedo resolver esto SIN utilizar cursores?
>
> Tengo la siguiente tabla:
>
> Cliente Monto
> A 100
> B 50
> C 25
> D 10
>
> Necesito devolver una columna adicional con los acumulados del monto, de
> esta manera:
>
> Cliente Monto Acumulado
> A 100 100
> B 50 150
> C 25 175
> D 10 185
>
>
> Gracias.
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004


Respuesta Responder a este mensaje
#3 Maximiliano D. A.
08/04/2004 - 21:34 | Informe spam
El tema es que si un monto se repite no te funcionara bien, si los montos
son distintos entonces no hay problema solo debes cambiar la forma que te
pase.

Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Martín López" escribió en el mensaje
news:%
Este caso funciona si los id de clientes estan en orden alfabetico, en el
caso que tengo que resolver están ordenados por monto. Te paso un ejemplo:

Cliente Monto
D 100
B 50
C 25
A 10

Resultado:

Cliente Monto Acumulado
D 100 100
B 50 150
C 25 175
A 10 185

Muchas gracias.

"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:#
> Hola, suponiendo que no hay dos clientes iguales aca te mando el


ejemplo:
>
> CREATE TABLE #PEPE (ID CHAR(30), MONTO INT)
>
> INSERT INTO #PEPE VALUES('A','100')
> INSERT INTO #PEPE VALUES('B','50')
> INSERT INTO #PEPE VALUES('C','25')
> INSERT INTO #PEPE VALUES('D','10')
>
> SELECT id, monto,
> (SELECT sum(monto) FROM #pepe e2 WHERE e2.id <= e.id) AS acumulado
> FROM #pepe e
> ORDER BY id
>
>
> Bye
>
>
> Salu2
> Maxi
>
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> MSN:
> Nunca consideres el estudio como una obligación sino como
> una oportunidad para penetrar en el bello y maravillosos
> mundo del saber.
> - Albert Einstein
>
>
>
> "Matín López" escribió en el mensaje
> news:
> > ¿Alguien sabes como puedo resolver esto SIN utilizar cursores?
> >
> > Tengo la siguiente tabla:
> >
> > Cliente Monto
> > A 100
> > B 50
> > C 25
> > D 10
> >
> > Necesito devolver una columna adicional con los acumulados del monto,


de
> > esta manera:
> >
> > Cliente Monto Acumulado
> > A 100 100
> > B 50 150
> > C 25 175
> > D 10 185
> >
> >
> > Gracias.
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
Respuesta Responder a este mensaje
#4 Martín López
08/04/2004 - 21:51 | Informe spam
Hice el cambio que me dijiste ("e2.id <= e.id" por "e2.monto >= e.monto") y
funciona bastante bien.
El único problema que tengo ahora es que puedo llegar a tener montos que se
repiten.
Si sabés alguna forma de solucionar esto, por favor avisame.

Saludos.

"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:#
El tema es que si un monto se repite no te funcionara bien, si los montos
son distintos entonces no hay problema solo debes cambiar la forma que te
pase.

Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Martín López" escribió en el mensaje
news:%
> Este caso funciona si los id de clientes estan en orden alfabetico, en


el
> caso que tengo que resolver están ordenados por monto. Te paso un


ejemplo:
>
> Cliente Monto
> D 100
> B 50
> C 25
> A 10
>
> Resultado:
>
> Cliente Monto Acumulado
> D 100 100
> B 50 150
> C 25 175
> A 10 185
>
> Muchas gracias.
>
> "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en


el
> mensaje news:#
> > Hola, suponiendo que no hay dos clientes iguales aca te mando el
ejemplo:
> >
> > CREATE TABLE #PEPE (ID CHAR(30), MONTO INT)
> >
> > INSERT INTO #PEPE VALUES('A','100')
> > INSERT INTO #PEPE VALUES('B','50')
> > INSERT INTO #PEPE VALUES('C','25')
> > INSERT INTO #PEPE VALUES('D','10')
> >
> > SELECT id, monto,
> > (SELECT sum(monto) FROM #pepe e2 WHERE e2.id <= e.id) AS acumulado
> > FROM #pepe e
> > ORDER BY id
> >
> >
> > Bye
> >
> >
> > Salu2
> > Maxi
> >
> > Buenos Aires Argentina
> > Desarrollador Microsoft 3 Estrellas .NET
> > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > MSN:
> > Nunca consideres el estudio como una obligación sino como
> > una oportunidad para penetrar en el bello y maravillosos
> > mundo del saber.
> > - Albert Einstein
> >
> >
> >
> > "Matín López" escribió en el mensaje
> > news:
> > > ¿Alguien sabes como puedo resolver esto SIN utilizar cursores?
> > >
> > > Tengo la siguiente tabla:
> > >
> > > Cliente Monto
> > > A 100
> > > B 50
> > > C 25
> > > D 10
> > >
> > > Necesito devolver una columna adicional con los acumulados del


monto,
de
> > > esta manera:
> > >
> > > Cliente Monto Acumulado
> > > A 100 100
> > > B 50 150
> > > C 25 175
> > > D 10 185
> > >
> > >
> > > Gracias.
> > >
> > >
> >
> >
> >
> > Outgoing mail is certified Virus Free.
> > Checked by AVG anti-virus system (http://www.grisoft.com).
> > Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
> >
> >
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004


Respuesta Responder a este mensaje
#5 Maximiliano D. A.
08/04/2004 - 22:15 | Informe spam
hola, debes buscar un orden, si es asi como decis vos podrias generar un
campo indentity que indique el orden, entonces si la tabla la ordenas por
monto luego ese podria tener el identity, es lo unico que se me ocurre ahora
:-(


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Martín López" escribió en el mensaje
news:
Hice el cambio que me dijiste ("e2.id <= e.id" por "e2.monto >= e.monto")


y
funciona bastante bien.
El único problema que tengo ahora es que puedo llegar a tener montos que


se
repiten.
Si sabés alguna forma de solucionar esto, por favor avisame.

Saludos.

"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:#
> El tema es que si un monto se repite no te funcionara bien, si los


montos
> son distintos entonces no hay problema solo debes cambiar la forma que


te
> pase.
>
> Bye
>
>
> Salu2
> Maxi
>
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> MSN:
> Nunca consideres el estudio como una obligación sino como
> una oportunidad para penetrar en el bello y maravillosos
> mundo del saber.
> - Albert Einstein
>
>
>
> "Martín López" escribió en el mensaje
> news:%
> > Este caso funciona si los id de clientes estan en orden alfabetico, en
el
> > caso que tengo que resolver están ordenados por monto. Te paso un
ejemplo:
> >
> > Cliente Monto
> > D 100
> > B 50
> > C 25
> > A 10
> >
> > Resultado:
> >
> > Cliente Monto Acumulado
> > D 100 100
> > B 50 150
> > C 25 175
> > A 10 185
> >
> > Muchas gracias.
> >
> > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió


en
el
> > mensaje news:#
> > > Hola, suponiendo que no hay dos clientes iguales aca te mando el
> ejemplo:
> > >
> > > CREATE TABLE #PEPE (ID CHAR(30), MONTO INT)
> > >
> > > INSERT INTO #PEPE VALUES('A','100')
> > > INSERT INTO #PEPE VALUES('B','50')
> > > INSERT INTO #PEPE VALUES('C','25')
> > > INSERT INTO #PEPE VALUES('D','10')
> > >
> > > SELECT id, monto,
> > > (SELECT sum(monto) FROM #pepe e2 WHERE e2.id <= e.id) AS acumulado
> > > FROM #pepe e
> > > ORDER BY id
> > >
> > >
> > > Bye
> > >
> > >
> > > Salu2
> > > Maxi
> > >
> > > Buenos Aires Argentina
> > > Desarrollador Microsoft 3 Estrellas .NET
> > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > MSN:
> > > Nunca consideres el estudio como una obligación sino como
> > > una oportunidad para penetrar en el bello y maravillosos
> > > mundo del saber.
> > > - Albert Einstein
> > >
> > >
> > >
> > > "Matín López" escribió en el mensaje
> > > news:
> > > > ¿Alguien sabes como puedo resolver esto SIN utilizar cursores?
> > > >
> > > > Tengo la siguiente tabla:
> > > >
> > > > Cliente Monto
> > > > A 100
> > > > B 50
> > > > C 25
> > > > D 10
> > > >
> > > > Necesito devolver una columna adicional con los acumulados del
monto,
> de
> > > > esta manera:
> > > >
> > > > Cliente Monto Acumulado
> > > > A 100 100
> > > > B 50 150
> > > > C 25 175
> > > > D 10 185
> > > >
> > > >
> > > > Gracias.
> > > >
> > > >
> > >
> > >
> > >
> > > Outgoing mail is certified Virus Free.
> > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
> > >
> > >
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.618 / Virus Database: 397 - Release Date: 09/03/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida