26. august 2003 - 08:30Der er
19 kommentarer og 1 løsning
SQL - sum af kolonner
Jeg har en tabel, hvor jeg via en SQL forespørgsel skal bruge en sum i en kolonne.
Mit problem er, at alle tallene i den kolonne, der skal summes, er positive. Nogle af dem skal trækkes fra i stedet.
Min forspørgsel er følgende:
select medarbejderkode, sum(timer) as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art in (1,3) group by medarbejderkode union select medarbejderkode, sum(timer)*-1 as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art not in (1,3) group by medarbejderkode order by medarbejderkode
i princippet jo. men så er mit problem, at de "timer" der ikke har art 1 og 3 (se ovenfor) LÆGGES TIL i stedet for at blive trukket fra. Dvs. at den så sammenlægger 33,3 og 37, hvilket giver 70,30. Resultatet skulle jo gerne give 3,7 (for første medarbejder). jeg skal have vendt fortegnet på nogle af timerne, INDEN de lægges sammen
create view justeret_fravarsposter as ((select medarbejderkode, timer, fravarskode, dato from fravarsposter where art in (1,3)) union (select medarbejderkode, sum(timer)*-1 as timer, fravarskode, dato from fravarsposter where art not in (1,3)))
og:
select medarbejderkode, sum(timer) as timer from justeret_fravarposter where fravarskode = 70 and dato >= '05-01-2003' group by medarbejderkode order by medarbejderkode
jeg rettede et par småting i dit script og så virker det.
Næste problem er, at justeret_fravarsposter ikke danner alle poster. Jeg har følgende poster:
30-05-03 7,40 ok 05-06-03 3,70 06-06-03 7,40 ok 13-06-03 7,40 ok 19-07-03 7,40 ok 31-05-03 7,40 ok 31-05-03 7,40 31-05-03 -7,40 ok 31-05-03 29,60 ok 31-05-03 -29,60 ok 31-05-03 29,60 31-05-03 -29,60 31-05-03 29,60 31-05-03 -29,60 31-05-03 29,60
OK er dem, der er dannet i justeret_fravarsposter. Ingen "ok" er dem, der kun findes i lønmodulet. Alle poster opfylder kriterierne så....
Hvordan "nulstiller" / sletter jeg et create view? Jeg vil gerne kunne genbruge justeret_fravarsposter i næste måned.
ok betyder at posten "kopieret" fra fravarsposter til justeret_fravarsposter ikke-OK betyder, at posten ikke er kopieret. dvs. at justeret_fravarsposter har ikke alle poster fra fravarsposter med. og så er jeg ligevidt.
select medarbejderkode, sum(timer) as timer from ( select medarbejderkode, sum(timer) as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art in (1,3) group by medarbejderkode union select medarbejderkode, sum(timer)*-1 as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art not in (1,3) group by medarbejderkode) tabelX order by medarbejderkode
Select t1.medarbejderkode, T1.timer+T2.timer from ( select medarbejderkode, sum(timer) as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art in (1,3) group by medarbejderkode) T1, (select medarbejderkode, sum(timer)*-1 as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art not in (1,3) group by medarbejderkode) T2 where T1.medarbejderkode=T2.medarbejderkode order by T1.medarbejderkode
"Column 'tabelX.medarbejderkode' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause."
Det kunne du nemt løse ved at group by igen på medarbejderkode som her, så skal du ikke lave 2 derived tabels og manuel summer timerne.
select medarbejderkode, sum(timer) as timer from ( select medarbejderkode, sum(timer) as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art in (1,3) group by medarbejderkode union select medarbejderkode, sum(timer)*-1 as timer from fravarsposter where fravarskode = 70 and dato >= '05-01-2003' and art not in (1,3) group by medarbejderkode) tabelX group by medarbejderkode order by medarbejderkode
Synes godt om
Ny brugerNybegynder
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.