webForumDet fria alternativet

Hämta genomsnitt under ett år

Databaser & SQL

4 svar · 854 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

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)

Medlem sedan dec. 200012 464 inlägg
#2

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.

Medlem sedan juli 200012 978 inlägg
#3

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.

Medlem sedan juni 20003 076 inlägg
#4

LarsG skrev:

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.

Medlem sedan dec. 200012 464 inlägg
#5

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.

265 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)