Tack för ett snabbt svar. Problemet är bara att databasen innehåller > 100 000 poster och det tar för lång tid att köra den frågan. Finns det något sätt att optimera?
Låt databasen göra sin beräkning, det är det den är bra på, även om skalärfunktioner kanske inte är det mest optimala. Visa ett litet timglas eller nåt istället; 100.000 rader är inte så farligt ändå.
En ännu bättre idé är att inte köra allt i en fråga. Normalt ska man försöka köra så få frågor som möjligt, men ur exekveringssynpunkt är det här inte en fråga, eftersom subselecten gör att det blir en fråga per rad i databasen. Även om selecten i sig är ganska lättviktig om år-kolumnen är indexerad är det klart suboptimalt och ska undvikas om det går. I det här fallet vore det klart effektivare att ställa två frågor om du inte har helt sinnessjuk latens mellan din applikation och databasen (typ, om den ena av burkarna står bakom ett 300-bauds modem...).
Om du ska få det snabbt så är det OveRRidEs förslag som gäller, låt databasen göra uträkningen.
Hur du gör det beror på vilken typ av databas du kör men i t.ex. SQL Server så bygger man en vy för detta. :)
Först väljer du fram antal rader/id/år med SELECT id, år, COUNT(*) AS antal FROM tabellen GROUP BY id, år ORDER BY år, id och sen hämtar du totalt antal id/år med SELECT år, COUNT(*) AS antal FROM tabellen GROUP BY år ORDER BY år. Sen får du loopa igenom det första resultatet, och på varje rad som inte har samma år som den föregående raden (inklusive den första) får du hämta ut nästa rad ur resultatet av den andra frågan och skriva ut en rubrik. Pseudokod:
idResult = (ställ frågan [I]SELECT id, år, COUNT(*) AS antal FROM tabellen GROUP BY id, år ORDER BY år, id[/I] till databasen)
yearResult = (ställ frågan [I]SELECT år, COUNT(*) AS antal FROM tabellen GROUP BY år ORDER BY år[/I] till databasen)
previousYear = "godtyckligt ogiltigt värde för ett årtal"
while (vi har inte passerat sista raden i idResult)
if (idResult("år") <> previousYear)
skriv ut yearResult("år") & " totalt: " & yearResult("antal")
previousYear = idResult("år")
gå till nästa rad i yearResult
end if
skriv ut idResult("id") & " " & idResult("antal")
gå till nästa rad i idResult
end while