Oprocz wymienionych sposobow podanych przez @kris2 mozesz zrobic to co potrzebujesz za pomoca jednego zapytania SQL, gdyz nie wszystkie RDBMSy maja zaimplementowane wyzej wymienione funkcje.
Jak rozumiem chcesz pogrupowac dane z kolumny "value" wzgledem kolumny "question_id".
Przede wszystkim nalezy pogrupowac dane wzgledem "question_id", a nie "value" ("value" jest kolumna agregowana, wiec nie moze byc grupowania wedlug tej kolumny). Zapytanie bedzie wygladalo nastepujaco :
SELECT SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id
Jako wynik otrzymamy tabele zawierajaca sume wszystkich wartosci value dla poszczegolnych wartosci pola question_id.
Cytat
chce policzyc jednym zapytaniem jednoczesnie ilosc wszystkich rekordow w bazie
Chyba chodzilo ci o ilosc wszystkich rekordow w tabeli "results" a nie w calej bazie.
Dodanie count(*) do pytania
SELECT COUNT(*) AS ilosc_rekordow, SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id
jest bledne. Dlaczego ? W wyniku da tabele, w ktorej w kolumnie "ilosc_rekordow" dane bede zagregowane dla kazdego "question_id", czyli w kazdej krotce bedzie zliczona ilosc wystapien tego samego "question_id", a nie calkowita ilosc rekordow w tabeli. Zeby osiagnac to, czego chcemy, nalezy uzyc podazytania :
SELECT (SELECT count(*) FROM results) AS ilosc_rekordow, SUM(value) AS suma_wartosci, question_id FROM results GROUP BY question_id