---
title: "Hämta genomsnitt under ett år"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/181887-hämta-genomsnitt-under-ett-år"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "doggelito"
published: "2010-01-05T10:04:55.000Z"
updated: "2010-01-07T09:58:33.000Z"
replies: 4
views: 874
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/181887-hämta-genomsnitt-under-ett-år"
---

# Hämta genomsnitt under ett år

## #1 — doggelito, 2010-01-05T10:04Z

Hej, 
Jag har en tabell som innehåller antalet anställda som ett företag har, när någon sägs upp eller anställs så adderas en rad i tabellen.
Det kan se ut så här:

```
ID     Employees     ChangeDate
1      20                2009-01-05
2      12                2009-10-22
...
```

Nu vill jag hämta ut genomsnittet anställda under ett år och undrar om det går i ren sql eller om jag behöver hämta ut och göra beräkningen i programmet?

Om man ser till exemplet ovan: 
20 var anställda 5 januari, i oktober blev 8 uppsagda, detta ska ge ett resultat av (räknat i huvudet) 18.
Varför just 18 är för att det till största delen under året varit 20 st och endast under 3 månader (oktober, november, december) varit 12.
Genomsnittet ska alltså "vikt"-beräknas.

Det jag vet är infon i tabellen samt start- och slutdatum för beräkningen dvs. 2009-01-01 - 2009-12-31.

Går det att beräkna i ren sql?
(använder ms sql server 2005)

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

## #2 — LarsG, 2010-01-05T17:28Z

Något enligt 

```
select sum(employees * (coalesce(
          (select min(month(change_date))
             from t                  
            where change_date <= '2009-12-31'                   
              and change_date > q.change_date),12) -                   
         case when year(change_date) = 2009 then month(change_date) else 1 end + 1))/12
  from t as q
 where change_date between
      (select max(change_date)
         from t
        where change_date < '2009-01-31')
   and '2009-12-31'
```

kanske.

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

## #3 — Lasp, 2010-01-05T17:40Z

Nu fick jag lära mig ett nytt ord "coalesce"  Häftigt LarsG. ;-)
Jag hoppas att det fungerar för doggelito som vill ha fram antalet helårsanställda.

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

## #4 — doggelito, 2010-01-06T10:38Z

> **[LarsG skrev:](https://www.webforum.nu/p/1493334)**
>
> Något enligt 
> 
>
>
> ```
> select sum(employees * (coalesce(
>           (select min(month(change_date))
>              from t                  
>             where change_date <= '2009-12-31'                   
>               and change_date > q.change_date),12) -                   
>          case when year(change_date) = 2009 then month(change_date) else 1 end + 1))/12
>   from t as q
>  where change_date between
>       (select max(change_date)
>          from t
>         where change_date < '2009-01-31')
>    and '2009-12-31'
> ```
>
> 
> 
> kanske.

Inte riktigt! :)

Får:
*Msg 130, Level 15, State 1, Line 5
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.*

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

## #5 — LarsG, 2010-01-07T09:58Z

Jaha, jag tycker att det borde gå bra då det är en skalär subselect.
Problemet är ju de fall då det inte är någon ändring i Januari och man måste hämta uppgift om antalet anställda från tidigare år. Ett sätt är att baka in det i en funktion som man anropar. Jag funderar lite mer.

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/181887-hämta-genomsnitt-under-ett-år
