Zapytanie które sumuje dane dopóki warunek nie zostanie spełniony

0

Witam,
Próbuje wykonać następujące zapytanie:
Mam bazę zamówień (data, wartość, nazwa klienta) i teraz jeżeli wartość zamówienia przekracza jakąś wartość to klient jest VIP.

Pytanie, jakiej składni użyć aby sumował mi wartość zamówień do jakiejś nałożonej granicy przeze mnie i podał to ostatnie zamówienie, które weszło do sumy.

W programowaniu wystarczyłaby pętla do while i gotowe, jak to napisać w SQL?
pozdrawiam

0

Dla konkretnego klienta:

SELECT idKlienta
FROM Zamowienia
WHERE idKlienta = :idKlienta
GROUP BY idKlienta
HAVING SUM(wartosc) >= JAKAS_WARTOSC

Wszyscy klienci VIP:

SELECT idKlienta
FROM Zamowienia
GROUP BY idKlienta
HAVING SUM(wartosc) >= JAKAS_WARTOSC
0

To zapytanie, aby wyświetlił VIP i nie VIP to żaden problem. Zadanie jest bardziej skomplikowane:

Chodzi o to, które zamówienie dało im status klienta VIP.
Załóżmy, że mamy takie dane:

Idklienta Wartosc Data
1 20000 1999-01-28
1 6000 1999-02-15
1 2500 2000-05-05
1 7000 2002-12-20
1 18000 2003-08-11
1 2000 2005-06-01
2 1000 2012-04-22
2 11000 2013-08-19
2 100000 2013-05-05
3 28000 2002-12-20
3 1500 2005-10-18
Wynik zapytania ma wyświetlić coś takiego (założenie, że od 30 000 to VIP)
Idklienta Wartosc Data nadania VIP
---------------- ---------------- ----------------
1 55000 2002-12-20
2 112000 2013-05-05
3 29500 -
0

Tak na szybko (MS SQL Server 2012+ , funkcje agregujące + OKNO) :

use tempdb
go

create table dbo.Zam
(	Id int identity (1,1),
	IdKlient int,
	Wart int,
	Data date
)

insert into dbo.Zam
values 

(1,20000,	'1999-01-28'),
(1,6000,	'1999-02-15'),
(1,2500,	'2000-05-05'),
(1,7000,	'2002-12-20'),
(1,18000,	'2003-08-11'),
(1,2000,	'2005-06-01'),
(2,1000,	'2012-04-22'),
(2,11000,	'2013-08-19'),
(2,100000,	'2013-05-05'),
(3,28000,	'2002-12-20'),
(3,1500,	'2005-10-18');

with VIP as 
(
select *  , CASE WHEN SUM(Wart) OVER( partition BY IdKlient ORDER BY DATA) >= 30000 THEN 'VIP'  END AS TypKlienta
from dbo.Zam
),
VIP_data as 
(
	select IdKlient, MIN(Data) as Data , 'VIP' as TypKlienta
	from VIP
	where TypKlienta = 'VIP'
	group by IdKlient
)
select z.IdKlient, SUM(z.Wart) as SumaZlecen, VIP_data.Data, VIP_data.TypKlienta
from dbo.Zam z left join 
 VIP_data on z.IdKlient = VIP_data.IdKlient 
group by z.IdKlient, VIP_data.Data, VIP_data.TypKlienta

drop table dbo.Zam

Ewenetualnie można to rozwiązać podzpyatniem skorelowanym

1 użytkowników online, w tym zalogowanych: 0, gości: 1