Avatar billede speder Nybegynder
01. februar 2003 - 18:47 Der er 11 kommentarer og
1 løsning

Akkumulere værdier i kolonne

Hej

Jeg har følgende tabel:

Id      Value
1        10
2        20
3        NULL
4        30

Hvordan laver jeg en forespørgsel som returnerer følgende:

Id      Value   
1        10
2        30
3        30
4        60

Det er vigtigt, at NULL betragtes som 0.

Takker,

SP
Avatar billede _darkstar_ Nybegynder
01. februar 2003 - 22:07 #1
Det tror jeg ikke at man kan hvis det skal være i rent SQL. Hvis der kommer et forslag i SQL som virker, vil jeg meget gerne høre om det.

Du kan selvfølgelig altid skrive en TRANSACT-SQL-procedure.
Avatar billede janus_007 Nybegynder
03. februar 2003 - 14:52 #2
men der betragtes null da som 30 ???
Avatar billede speder Nybegynder
03. februar 2003 - 14:55 #3
Nej da - 10=10, 10+20=30, 10+20+null=30, 10+20+null+30=60
Avatar billede larildsen Nybegynder
05. februar 2003 - 11:01 #4
Du skal anvende funktionen ISNULL(VALUE,0) de steder i din SQL, hvor du anvender VALUE
Avatar billede janus_007 Nybegynder
05. februar 2003 - 11:05 #5
larildsen-->> Det ændrer jo ikke noget på at speder vil have akkumuleret værdier!
Måden det kan løses på er som darkstar siger, ved at bruge en sp og evt. cursor.
Avatar billede larildsen Nybegynder
05. februar 2003 - 13:21 #6
Hvis nu tabellen hedder nullcheck så

select n1.id, (select sum(n2.value) from nullcheck n2 where n2.id <= n1.id) as value from nullcheck n1 order by n1.id

evt.

select n1.id, (select sum(isnull(n2.value,0)) from nullcheck n2 where n2.id <= n1.id) as value from nullcheck n1 order by n1.id
Avatar billede _darkstar_ Nybegynder
05. februar 2003 - 17:03 #7
larildsen>>>> det tager jeg hatten af for. Jeg tror at den holder. Der bliver ladet en forfærdelig bunke forespørgseler og jeg tror at det er meget sandsynligt at det går hurtigere hvis man selv laver beregningen, men alligevel...
Avatar billede larildsen Nybegynder
06. februar 2003 - 11:58 #8
_darkstar_>>>> Jeg er helt klar over, at der bliver lavet mange opslag, og at det kan klares meget bedre client-side, men hvis der er få rækker i tabellen, og forespørgslen ikke kører ret ofte, så mener jeg løsningen er anvendelig.
Hvis tabellen er stor, eller tingene skal køre ofte, så skal det løses programmatisk
Avatar billede sql_god Nybegynder
06. februar 2003 - 13:13 #9
Hvis man er ude i en situation som denne, er det sandsynligvis fordi datamodellen er for dårlig. Kære venner, lad os IKKE bruge tid på overhovedet at lave sådanne ting med SQL, det er det sq ikke beregnet til !
Avatar billede speder Nybegynder
06. februar 2003 - 13:16 #10
øh, der er nu ikke noget galt med datamodellen, men når du arbejder med standardapplikationer som f.eks. Crystal Reports el. lign. så er der situationer, hvor det er meget mere hensigtsmæssigt (af vedligeholdelseshensyn) at henlægge logikken til SQL.
Avatar billede _darkstar_ Nybegynder
06. februar 2003 - 13:29 #11
I princippet burder der da ikke være noget galt i sådan en forespørgsel. Filosofien er jo at alt hvad man kan klemme ind i SQL, skal optimizeren prøve at håndtere.

Grunden til at flere her er imod at gøre det, er fordi at vi (sandsynligvis med rette!) har en idé om at det kan optimizeren ikke klare. Det burde den altså bare kunne...
Avatar billede larildsen Nybegynder
07. februar 2003 - 01:36 #12
En anden database som jeg kender kan lave nummeret, og hvis Larry Ellison's database kan, og der er "demand" i markedet for det, så kommer SQL Server også til at kunne det i en fremtidig release.
Spørgsmålet er, kan det betale sig at rafinere query'et mere end mit forslag, eller ej. Det kan der jo regnes på, såfremt man har et overblik over hvor ofte statementet bliver udført, og hvor "dyrt" det er at udføre.
Det ville være en drøm, hvis aggregerings funktionerne blev lidt mere udviklet.
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