---
title: "Göra allt i en fråga?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/162862-göra-allt-i-en-fråga"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "johgu"
published: "2007-07-24T14:31:13.000Z"
updated: "2007-07-29T17:20:58.000Z"
replies: 8
views: 623
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/162862-göra-allt-i-en-fråga"
---

# Göra allt i en fråga?

## #1 — johgu, 2007-07-24T14:31Z

Jag har en tabell som ser ut:

\[ID\] \[År\]
1   2006
1   2006
1   2006
2   2006
1   2004
2   2004

Nu vill jag få ut resultat enligt följande:

ID   ANTAL

2004 totalt: 2
\----------
1     1
2     1

2006 totalt: 4
\----------
1     3
2     1

Är detta möjligt att göra i en enda fråga?

Permalänk: https://www.webforum.nu/p/162862

## #2 — emission, 2007-07-24T14:47Z

> **johgu skrev:**
>
> Är detta möjligt att göra i en enda fråga?

Javisst (med det är bättre att fråga i SQL-forumet. Det har inte med ASP att göra). 

```
SELECT ID,År,COUNT(*),(SELECT COUNT(*) FROM tabellen t2 WHERE t1.År=t2.År) as Total FROM tabellen t1
GROUP BY ID, År
```

Permalänk: https://www.webforum.nu/p/2005873

## #3 — johgu, 2007-07-24T15:46Z

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?

Permalänk: https://www.webforum.nu/p/2005897

## #4 — OveRRidE, 2007-07-24T17:37Z

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å.

Permalänk: https://www.webforum.nu/p/2005923

## #5 — spango, 2007-07-25T07:34Z

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...).

Permalänk: https://www.webforum.nu/p/2006020

## #6 — johgu, 2007-07-25T07:41Z

Ok. Vilka två frågor skulle du ställt isf?

Tänkte göra ett test och se vad som blir snabbast.

Permalänk: https://www.webforum.nu/p/2006022

## #7 — doggelito, 2007-07-25T08:19Z

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. :)

Permalänk: https://www.webforum.nu/p/2006035

## #8 — spango, 2007-07-25T08:19Z

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
```

Permalänk: https://www.webforum.nu/p/2006036

## #9 — LarsG, 2007-07-29T17:20Z

Flyttas från asp

Permalänk: https://www.webforum.nu/p/2010175

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/162862-göra-allt-i-en-fråga
