Avatar billede ullesan Nybegynder
03. juli 2013 - 19:48 Der er 3 kommentarer og
1 løsning

Sum af tal for hver time

Hej

Jeg har en MSSQL compact 4 database hvor jeg har et tal felt samt et datetime felt.

I databasen kan der være flere tal værdier for samme dag, dvs

Tal    Tidspunkt
---------------
32    01-01-2013 11:00:00
42    01-01-2013 11:03:42
52    01-01-2013 12:22:44
55    02-01-2013 21:33:22


Er det muligt at hente summen af tal feltene for hver time (0-23)... Hvis summen er 0 eller null skal den returnere 0 for den pågældende time altså

Tal      Time af tidspunkt for specifikt dag
--------------------------------------------
0        0
0        1
0        2
...
74      11
52      12
0        13
...
0        23


SQLen skal begrænses så den kun viser for en dag ad gangen, så der kun vil være 24 rækker
Avatar billede Slettet bruger
03. juli 2013 - 21:45 #1
WITH Klokken AS
(SELECT 0 Time
UNION ALL
SELECT Time+1 FROM Klokken
WHERE Time < 23
)
,Tabel AS
(SELECT DATEPART(hour,Tidspunkt) Time, sum(Tal) Tal
FROM Tabel
GROUP BY DATEPART(hour,Tidspunkt)
)
SELECT k.Time, ISNULL(t.Tal,0) Tal
FROM Klokken k
LEFT OUTER JOIN Tabel t
on t.Time = k.Time
Avatar billede ullesan Nybegynder
04. juli 2013 - 07:35 #2
hej rahp...

jeg får en parse error når jeg tilretter dit query med tabel navnet og data felt navnet... Fejlen opstår når den skal parse "WITH" ved første linie.

Som skrevet er det en MSSQL Compact 4 database jeg har at gøre med og har nogle begrænsninger.

Kan man formulere dit query på en anden måde via nested queries, som MSSQL Compact måske vil kunne understøtte?
Avatar billede Slettet bruger
05. juli 2013 - 11:19 #3
En mere simpel løsning:

select 0 Time
,(SELECT sum(Tal) FROM Tabel
WHERE DATEPART(hour,Tidspunkt) = 0
) Tal
UNION ALL
select 1 Time
,(SELECT sum(Tal) FROM Tabel
WHERE DATEPART(hour,Tidspunkt) = 1
) Tal
UNION ALL
select 2 Time
,(SELECT sum(Tal) FROM Tabel
WHERE DATEPART(hour,Tidspunkt) = 2
) Tal
- o.s.v. -
Avatar billede ullesan Nybegynder
05. juli 2013 - 20:31 #4
Hej rahp


Tak for svaret... Det løser opgaven, bortset fra den ikke skriver 0 ved null values, men pyt skidt.

Jeg har løst det på en anden måde, hvor jeg har oprettet en "dummy" tabel med en enkelt kolonne for klokkeslæt (0-23) og bruger følgende SQL, hvilket giver mig det ønskede resultat


SELECT COALESCE (SUM(d.TT701), 0) AS TT701, COALESCE (SUM(d.TT702), 0)
AS TT702, Timer.time AS Time FROM Data AS d RIGHT OUTER JOIN
Timer ON DATEPART(hour, d.tidspunkt) = Timer.time
GROUP BY Timer.time


Sql'en bliver holdt kort, samt jeg har bedre mulighed for at udvide med flere summationer af andre kolonner via dynamisk SQL generering fra script.

Men du får alligevel point for bidrag
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