Предполагая, что у вас есть следующая таблица пожертвований (насколько я думаю, ваш столбец идентификатора указывает на пользователя, я не был бы уверен):
| ID | UserId | Donation |
| 1 | 1 | 60 |
| 2 | 1 | 35 |
| 3 | 2 | 70 |
| 4 | 2 | 40 |
| 5 | 3 | 90 |
Следующий запрос даст вам количество пользователей с их общим пожертвованием <100</p>
SELECT COUNT(1)
FROM (
SELECT UserId
FROM Donations
GROUP BY UserId
HAVING SUM(Donation) < 100
) AS t
Обновление на основе дополнительной информации.Я не верю, что вы можете получить то, что вы хотите, с помощью одного оператора SQL, что вам нужно сделать, это создать курсор, который зацикливается вокруг записей, которые вы хотите (в подходящем порядке), вставляя идентификатор во временную таблицу и поддерживая общее значениепожертвований.Когда сумма превысит ваш предел, вырвитесь из цикла курсора и верните результаты.Что-то вроде этого:
CREATE PROCEDURE GetTopDontations( limit DECIMAL(...) )
BEGIN
CREATE TEMPORARY TABLE t1 (
id INT
);
DECLARE total, Donation DECIMAL(...);
DECLARE Id INT;
DECLARE curDonations CURSOR FOR SELECT ID, Dontaion FROM Donations ORDER BY <something relevant>;
SET total = 0.0;
OPEN curDonations;
read_loop: LOOP
FETCH curDonations INTO Id, Donation;
INSERT INTO t1( id ) VALUES ( Id );
SET total = total + Donation;
IF( total > limit ) THEN
LEAVE read_loop;
END IF;
END LOOP:
CLOSE curDonations;
SELECT d.*
FROM Donations d
INNER JOIN t1
ON d.Id = t1.Id;
END;