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