Avatar billede michaelthomassen Nybegynder
17. februar 2005 - 14:35 Der er 7 kommentarer og
1 løsning

Gruppering på ugedage

Tabel:
UnitID int autoincrement
CreateDate date
CreatorID int


Ønsket resultatsæt:

BrugerID Mandag Tirsdag Onsdag Torsdag Fredag Weekend Total

Dvs. én række pr. CreatorID, med antallet af Units lavet på de enkelte ugedage + weekend (lørdag+søndag), og en total.

Denne kan måske hjælpe lidt, den giver bare resultatet på flere rækker
SELECT COUNT( * ), DATEPART(DW,CreateDate), CreatorID FROM Tabel GROUP BY DATEPART(DW,CreateDate), CreatorID


På forhånd tak
Avatar billede ldanielsen Nybegynder
17. februar 2005 - 15:08 #1
Det bliver jo lidt tungt men:



SELECT CreatorID,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) = 1) AS Mandag,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) = 2) AS Tirsdag,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) = 3) AS Onsdag,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) = 4) AS Torsdag,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) = 5) AS Fredag,
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID AND DATEPART(dw, CreateDate) IN (6, 7)) AS Weekend
FROM Tabel t1
GROUP BY CreatorID
Avatar billede ldanielsen Nybegynder
17. februar 2005 - 15:09 #2
UPS

Der skal nok være en

SET DATEFIRST 1

så den ikke regner Søndag for dag 1
Avatar billede lorentsnv Nybegynder
17. februar 2005 - 15:17 #3
Man brugger ofte CASE til at 'pivotere' med:

Select CreatorID, Sum(Man) as Mandag, Sum(Tir) as Tirsdag,............
FROM(
  SELECT CreatorID,
    CASE DATEPART(dw, CreateDate) = 1 THEN 1 ELSE 0 END as Man
    CASE DATEPART(dw, CreateDate) = 2 THEN 1 ELSE 0 END as Tir
    CASE DATEPART(dw, CreateDate) = 3 THEN 1 ELSE 0 END as Ons
    CASE DATEPART(dw, CreateDate) = 4 THEN 1 ELSE 0 END as Tor
    CASE DATEPART(dw, CreateDate) = 5 THEN 1 ELSE 0 END as Fre
    CASE DATEPART(dw, CreateDate) > 5 THEN 1 ELSE 0 END as Week
  From Tabel
  ) as T
GROUP BY CreatorID
Avatar billede michaelthomassen Nybegynder
17. februar 2005 - 15:18 #4
Perfekt, takker!
Avatar billede ldanielsen Nybegynder
17. februar 2005 - 15:22 #5
lorentsnv > det var sgu' SMART!!

Vil du ikke ha nogle P for det?
Avatar billede lorentsnv Nybegynder
17. februar 2005 - 15:25 #6
Idanielsen > Du var først, så behold du bare poengene. Jeg må heller være lidt hurtigere næste gang  ;-)
Avatar billede michaelthomassen Nybegynder
17. februar 2005 - 15:29 #7
Der manglede godt nok en Total, men den laves jo bare på samme måde:
(SELECT COUNT(*) FROM Tabel WHERE CreatorID = t1.CreatorID) AS Total
Avatar billede ldanielsen Nybegynder
17. februar 2005 - 15:35 #8
Ja. Man lur lige lorentsnv's løsning.

Jeg er først lige blevet opmærksom på mulighederne med CASE, og dette er en af de smartere anvendelser jeg har set. Mon ikke den også er mindre tung?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester