webForumDet fria alternativet

Matrisliknande resultat?

Databaser & SQLur Databashanterare & SQL

5 svar · 848 visningar · startad av Compusa

CompusaMedlem sedan jan. 20023 327 inlägg
#1

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
#2
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
#3

Tack för snabbt svar LarsG :)

Har testat och det fungerar bra!

CompusaMedlem sedan jan. 20023 327 inlägg
#4

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
#5

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
#6

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
133 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)