sprawdzanie 3 wierszy jednocześnie

0

Witam, mam mały problem ze skonstruowaniem zapytania do MSSQL server 2008. Mam tabele która przechowuje dane o platnosciach:

|	id	|	klient_id	|	oplata_id	|	kwota	|
	1			25		1			80
	2			25		2			90				
	3			25		3			0	
	4			26		1			0
	5			26		2			0
	6			26		3			0

Opłaty są 3. Więc dla każdego klienta przechowuje dokładnie 3 wiersze. Dla każdej opłaty i klienta jest podana kwota.
Potrzebuje pobrać tylko tych klientów, którzy maja w każdej opłacie kwote 0. Czyli np klient o id (klient_id) = 26. (3 ostatnie wiersze). Pierwszy klient ma tylko jedną opłatę = 0 więc jego nie potrzebuje.
Jak zrobić zapytanie?

0

Nie wiem czy to optymalne, ale w SQLite to by wyglądało gdzieś tak ;) W MSSQL nie powinno być różnic.

SELECT klient_id FROM (SELECT klient_id, (sum(kwota)) as platnosc FROM oplaty GROUP BY klient_id) WHERE platnosc==0

Zobacz sobie np. lekcję http://www.sql-kursy.pl/ms-sql-kurs-funkcje-agregujace-group-by-5.html

Załączam screena i plik bazy SQLite (do otworzenia np. w programie Sqliteman). Zapytanie zapisałem w widoku.

0

po co to podzapytanie?

SELECT klient_id, SUM(kwota) AS platnosc FROM oplaty GROUP BY klient_id HAVING SUM(kwota) = 0

chociaż po namyśle to nie jest dobre zapytanie bo może się zdarzyć, że płatność1 = 100, płatność2 = 0 oraz płatność3 = -100 i wtedy też zwróci to id. Poprawniej by było

SELECT klient_id, SUM(Abs(kwota)) AS platnosc FROM oplaty GROUP BY klient_id HAVING SUM(Abs(kwota)) = 0

lub bez sumowania

SELECT 
  o1.klient_id 
FROM 
  oplaty o1, 
  oplaty o2, 
  oplaty o3 
WHERE 
  o1.klient_id = o2.klient_id 
  AND o1.klient_id = o3.klient_id 
  AND o1.opłata_1d = 1 AND o1.kwota = 0 
  AND o2.opłata_1d = 2 AND o2.kwota = 0 
  AND o3.opłata_1d = 3 AND o3.kwota = 0
1
abrakadaber napisał(a):

Hehe, a kto mądry by wpisał ujemną płatność :) ?

Być może w Twoim programie płatność nigdy nie jest ujemna, ale w dużych programach często występują ujemne płatności (zwykle oznaczają wypłaty z kasy)

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