Avatar billede stejuu Novice
08. oktober 2014 - 15:41 Der er 6 kommentarer og
2 løsninger

Lægge tal sammen løbende

Jeg er ret ny på MS SQL, men har en del erfaring med Access, hvor nedenstående også altid har voldt mig problemer.

Jeg har en tabel hvor der med nogenlunde fast interval bliver indsat en værdi.

Kolonne 1 = Timestamp
Kolonne 2 = Antal

Nu vil jeg gerne lave en ny kolonne der angiver løbende sum (Til brug i en graf)

Hvordan lægger jeg de nye tal sammen med det sidste?

Eks.
          Timestamp    Antal  LøbendeSum
Række 1      15:00        0        0 ?
Række 2      15:30        40        40 ?
Række 3      16:00        40        80 ?

Nogen der har en god ide?
Avatar billede arne_v Ekspert
08. oktober 2014 - 16:00 #1
Ja.

Lav den akkumulering programmatisk og ikke i SQL!

Hvis du insisterer på at bruge SQL til noget som det ikke er beregnet til, så prøv:

SELECT tid,antal,(SELECT SUM(antal) FROM tabel t2 WHERE t2.tid <= t1.tid) FROM tabel t1
Avatar billede kjulius Novice
08. oktober 2014 - 18:34 #2
At lave en løbende saldo/sum/total er ikke noget SQL er særligt god til. Der er nogle muligheder, men de er ikke gode eller effektive, så jo flere rækker du har i din tabel, jo mere "bløder" du.

Som regel vil det være bedre at lave denne opsummering i dit program efterhånden som du indlæser rækkerne. Men der er selvfølgelig tilfælde, hvor det ikke er en mulighed, f.eks. hvis du bruger komponenter, der skal bruge et færdigt recordsæt.

I de tilfælde kan du bruge den traditionelle metode, som arne præsenterede, men der er også et par andre muligheder. Især hvis du bruger en ny SQL Server 2012, vil der være mulighed for at bruger den nye window funktion.

Hvis du kan bruge en engelsk-sproget artikel, så læs nedenstående, som på en god pædagogisk måde giver et overblik over flere af mulighederne:
http://www.codeproject.com/Articles/300785/Calculating-simple-running-totals-in-SQL-Server

Ovennævnte artikel kommer ikke ind på brugen af cte, der kom til som en mulighed med SQL Server 2005:
http://blog.sqltechie.com/2009/04/how-to-do-running-sum-using-cte-sql.html

Den metode skulle efter sigende også være meget hurtigere end den traditionelle med subselect. Den bruger en rekursiv metode. Datamængden der kan behandles er derfor begrænset af SQL Serverens loft for hvor mange gange der kan kaldes rekursivt. Hvis man angiver MAXRECURSION=0 sætter man begrænsningen ud af kraft, og kan således i teorien behandle et meget stort antal rækker, men hvis forespørgslen er lavet forkert, kan man samtidig løbe ind i et uendeligt loop. Så under test bør man sætte den til en anden værdi (som kan være mellem 1 og 32767 - standard er 100).

Med mindre du har en stor datamængde vil metoden du bruger til at implementere din løbende sum nok ikke betyde det store. Men jo større datamængden er, des mere bør du kigge på alternativer, der er mere optimale end subselect metoden.

Hvis du har mod på at bruge en stored procedure, kan du selvfølgelig også bruge en implementering med server-side cursor.
Den kan faktisk i flere tilfælde være hurtigere end flere af de ovennævnte, selv om brugen af cursor-side cursors generelt har et dårligt ry. Men det kræver, at du har adgang til at oprette en stored procedure på SQL serveren, og at din komponent kan kalde den for at hente recordsættet fra den.
http://www.sqlteam.com/article/calculating-running-totals

Held og lykke med dit projekt.
Avatar billede arne_v Ekspert
08. oktober 2014 - 18:44 #3
Bemaerk at SP loesningen ogsaa kan bruge den programmatiske model fremfor SQL, da man i SQLServer kan lave en SP i C# i.s.f. det normale TSQL.
Avatar billede stejuu Novice
09. oktober 2014 - 11:08 #4
Rigtig mange tak for den hurtige respons. tror jeg vil følge rådet og skrive det i VB på websiden.

arne_v og kjulius, skriver I lige et svar og så jeg kan tildele halvdelen til Jer hver.
Avatar billede arne_v Ekspert
09. oktober 2014 - 16:08 #5
svar
Avatar billede Slettet bruger
10. oktober 2014 - 12:37 #6
En lille kommentar: Løbende summer virker fint i SQL (specielt fra version 2012) ved hjælp af Analytic Functions.
Læs f.eks. her: http://technet.microsoft.com/en-us/library/hh213234(v=sql.110).aspx
Avatar billede 2c Nybegynder
19. oktober 2014 - 11:15 #7
Ja,

Efter SQL server 2012 er det blevet nemt at lave mere analytiske ting i SQL server.

Jeg har skrevet en blog post om det her. http://clausoncode.dk/wp/?paged=3 I mit eksempel har jeg beregnet det løbende gennemsnit, men det kan nemt laves om til løbende sum. Sådanne beregninger bør laves på SQL serveren.
Avatar billede Slettet bruger
29. oktober 2014 - 11:20 #8
Du kan gøre brug af LAG LEAD funktionen i SQL server 2012. Dette ville kunne hjælpe dig.
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

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