Avatar billede aphandersen Juniormester
14. november 2009 - 20:33 Der er 19 kommentarer og
1 løsning

Kumuleret sum i SQL (VB.NET)

Hej Jeg er ved at lave et program i VB.NET med en tilhørende MS SQL database. Nu skal jeg lave en query, hvor jeg gerne vil have en kollonne ekstra i Databasesettet der angiver den kumulerede sum af en af kollonnerne i databasen. Jeg har indtil videre prøvet med følgende query:

SELECT id, UserID, Dato, Rentedato, Tekst, Belob, Gennemfort, kid,(SELECT SUM(Belob) FROM Transaktioner) AS Saldo,FROM Transaktioner

Men denne accepterer den ikke. Den siger "There was an error parsing the query". Kan i se nogle fejl? Er der andre måder at lave dette på?
Avatar billede arne_v Ekspert
14. november 2009 - 20:49 #1
komma før FROM
Avatar billede arne_v Ekspert
14. november 2009 - 20:50 #2
Men når du fixer det får du en anden fejl.
Avatar billede arne_v Ekspert
14. november 2009 - 20:50 #3
Det nemmeste ville være at akkumulere i VB.NET !
Avatar billede aphandersen Juniormester
14. november 2009 - 21:22 #4
Selvom kommaet bliver fjernet er fejlen der stadig.

Arne_v: hvordan gør man det?
Avatar billede arne_v Ekspert
14. november 2009 - 21:36 #5
Det afhænger jo lidt af hvordan du henter data.

Med en data reader, så henter duy en række af gangen og så kan du nemt beregne den akkumulerede værdi.

Bruger dy data sets, types data sets, NHibernate, LINQ to SQL, LINQ to EF etc. skal det gøres på en lidt anden måde, men skulle stadig være mulig.
Avatar billede aphandersen Juniormester
14. november 2009 - 21:41 #6
Jamen jeg bruger datasets. Jeg bruger ingen kode, men blot de indbyggede funktioner i Visual Studio 2008 Express til at lave Datasets med.
Avatar billede arne_v Ekspert
14. november 2009 - 22:34 #7
Du kan formentligt ikke gøre det udden at skrive kode. Men at tilføje en kolonne til et data set og beregne værdier for den er ikke svært.
Avatar billede arne_v Ekspert
14. november 2009 - 22:38 #8
Hvis det skal være i SQL, så må det være noget a la:

SELECT id, UserID, Dato, Rentedato, Tekst, Belob, Gennemfort, kid,(SELECT SUM(Belob) FROM Transaktioner t2 WHERE t2.id<=t1.id) AS Saldo FROM Transaktioner t1
Avatar billede aphandersen Juniormester
15. november 2009 - 00:29 #9
Hej Arne!

Den query du postede der kan jeg ikke gennemføre. Den skriver "There was an error parsing the query. [Token line number 1, Token line offset = 76, Token in error = SELECT]. Hvad kan der være galt her. Må man slet ikke have select inde i en select-sætning?
Avatar billede arne_v Ekspert
15. november 2009 - 00:33 #10
Jo.

1> select f1 from t1
2> go
f1
-----------
          1
          2
          3
          4

(4 rows affected)
1> select f1,(select sum(f1) from t1 a where a.f1 <= b.f1) as f1acc from t1 b
2> go
f1          f1acc
----------- -----------
          1          1
          2          3
          3          6
          4          10

(4 rows affected)
Avatar billede arne_v Ekspert
15. november 2009 - 00:33 #11
Hvilken version af SQLServer bruger du ?
Avatar billede aphandersen Juniormester
15. november 2009 - 00:50 #12
Jeg bruger MS SQL Server 2008 der hører med til Visual Basic Express Edition 2008.
Avatar billede aphandersen Juniormester
15. november 2009 - 00:57 #13
Måske har det noget at gøre med at man ikke kan have to Select-statements i en. Men kan man evt. adskille det i 2 queries og så kalde den ene fra den anden?
Avatar billede arne_v Ekspert
15. november 2009 - 04:59 #14
Som vist i #10 kan det godt lade sig gøre.
Avatar billede arne_v Ekspert
15. november 2009 - 05:00 #15
Lad os lige få:
* VB.NET koden med SQL
* fejlmeddelsen
så må vi se om vi kan finde ud af hvad der foregår.
Avatar billede janus_007 Nybegynder
15. november 2009 - 17:24 #16
Hej peddi..

jojo, man kan skam sagtens gøre som arne skriver. Har du prøvet at gøre det direkte i Management Studio?

Arnes version kan også omskrives til:

select f1, f1acc from t1 b
outer apply(
        select sum(f1) from t1 where f1 <= b.f1
) as f1acc

Men anyway.. begge versioner skal virke! Men jeg tror nemlig også det skyldes noget andet, eks.vis i applikationen :)
Avatar billede hrc Mester
15. november 2009 - 21:44 #17
janus: Så lærte jeg om apply (cross og outer). Tak for det. Nu skal bare finde et sted at bruge det.

Er det ikke en sløv query da den skal lave en select sum(f1) for hver record i t1 - især i forhold til et gennemløb på klient-siden?
Avatar billede janus_007 Nybegynder
15. november 2009 - 23:54 #18
hej hrc

Sløv query... hmm, det er et relativt begreb :)! Den læser alligevel alle records igennem som opfylder kriteriet, den summerer blot undervejs :) Men det er klart at der naturligvis bruges mere CPU end en plain SQL.
Afhængig af apply-querien kan den ikke altid afvikles hos klienten, så.... nu denne her vi har lavet her er nem, men det kunne være en langt mere kompliceret fætter som kræver adgang til mange tabeller/ functions osv.
Avatar billede hrc Mester
16. november 2009 - 10:09 #19
janus: Det er nok en korrekt antagelse at de har optimeret kørslen for de mest almindelige funktioner, eksempelvis så sum bare er en løbende optælling (syntes heller ikke det var sløvt på 100000 records) - men uden en vis optimering ville en apply nok være det.
Avatar billede aphandersen Juniormester
18. februar 2013 - 13:16 #20
Jeg lukker tråden nu, da den er forældet og der ikke er modtaget svar.
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