CompusaMedlem sedan jan. 20023 327 inlägg Hej :)
Låt säg att jag vill göra en utsökning på antalet timmar som vissa personer har jobbat inom ett visst tidsintervall, säg 2009-01-01 till 2009-12-31..
Resultatet skulle jag vilja presentera grafiskt på följande vis:
Namn.......Jan....Feb....Mars...Dec...Summa
Janne.........5......10.......20......0..........35
Olof...........0........5........8.......3.........16
Summa.......5.......15......28.......3.........51
Låt säga att jag har följande tabeller:
Personer: id, namn
RegistreradTid: id, datum, antal, personId
Finns det något fiffigt sätt att lösa detta på med SQL?
LarsGMedlem sedan dec. 200012 464 inlägg select name,
sum(case when extract(month from datum) = 1 then
antal else 0 end) as jan,
sum(case when extract(month from datum) = 2 then
antal else 0 end) as feb,
...
from personer
left join registreradTid
on personer.id = registreradTid.personId
and datum between date '2009-01-01' and date '2009-12-31'
group by name
Du kan behöva ändra funktionsanropet extract och datumliteraler beroende på DBMS.
CompusaMedlem sedan jan. 20023 327 inlägg Tack för snabbt svar LarsG :)
Har testat och det fungerar bra!
CompusaMedlem sedan jan. 20023 327 inlägg Fortsätter posta i samma tråd och markerar som löst igen om jag får ett bra svar ;)
Låt säga att jag har både ett från-datum och ett till-datum på en tidregistrering, kan jag då smeta ut resultatet?
Exempel: Janne har jobbat tio timmar mellan april och maj och det ger följande resultat (Antal timmar / till-månad - från-månad):
Namn.......Apr....Maj....
Janne.........5......5.......
Så som det är idagsläget så får jag följande resultat:
Namn.......Apr....Maj....
Janne.........10......0.......
LarsGMedlem sedan dec. 200012 464 inlägg Jag skulle inte försöka göra allt i SQL. Ta fram totala antal timmar per person och gör utskriften per månad i ditt presentationslager.
CompusaMedlem sedan jan. 20023 327 inlägg Det lutar åt att jag gör så här. Det borde väl kunna fungera?
SUM(CASE
WHEN DATEPART(WEEK, Start) = 11 AND DATEPART(WEEK, [End]) = 11 THEN
-- Använd antal om start och slutdatum är inom samma vecka
antal
WHEN DATEPART(WEEK, Start) = 11 THEN
-- Om olika veckor, dela antal genom två och trunkera på startdatum
antal / 2
WHEN DATEPART(WEEK, [End]) = 11 THEN
-- Om olika veckor, dela antal genom två och addera resten på slutdatum
antal / 2 + antal % 2
ELSE
0
END) AS v11