Avatar billede brobaek Nybegynder
07. oktober 2004 - 13:57 Der er 15 kommentarer

Sidste dato pr. konto

Jeg har to tabeller, tblKonti og tblRykker.

tblKonti indeholder:
- Kontonr
- Saldo
Een konto med een saldo

tblRykker indeholder:
- Kontonr
- Dato
- Saldo
Der kan altså være flere konti med forskellige datoer

Jeg vil så gerne lave et udtræk, som viser:
- alle konti
- saldoen og datoen for seneste (ift. dato) rykker (hvis der er en rykker - det er ikke altid tilfældet)

Det skal være i en SQL-streng (skal proppes ind i en VB-funktion), og forespørgslen må derfor kun inkludere tabeller.

/Martin
Avatar billede brobaek Nybegynder
07. oktober 2004 - 13:59 #1
Udtrækket skal selvfølgelig også vise tblKonti.Saldo (altså, den nuværende saldo)
Avatar billede skwat Praktikant
07. oktober 2004 - 14:03 #2
det er en join med max på tblRykker.dato og group by på tblKonti.Kontonr
Avatar billede skwat Praktikant
07. oktober 2004 - 14:04 #3
i dur med
select tblKontonr.Kontonr, max(tblRykker.dato)
from tblKontonr, tblRykker
where tblKontonr.Kontonr = tblRykker
group by tblKontonr.Kontonr
Avatar billede brobaek Nybegynder
07. oktober 2004 - 14:48 #4
Nej, jeg skal ikke bare finde max(tblRykker.dato), men max dato + den dertil hørende saldo!
Avatar billede overchord Nybegynder
07. oktober 2004 - 14:52 #5
SELECT tblkontonr.kontonr, max(tblrykker.Dato), tblrykker.saldo FROM tblkontonr INNER JOIN tblrykker ON tblkontonr.kontonr = tblrykker.kontonr GROUP BY tblkontonr.kontonr, max(tblrykker.Dato);
Avatar billede brobaek Nybegynder
07. oktober 2004 - 15:03 #6
OK - kan I ikke prøve selv at lave en simpel db i Access med bare 2 konti og 4 rykkere (2 til hver) - så kan I måske bedre se problematikken ?

overchord's > Din aggregatfunktion er ikke valid pga. manglende aggregering i tblrykker.saldo

Min spørgsmål er _ikke_ bare et spørgsmål om aggregering, men et spørgsmål om at inkludere en (flere) select indenfor forespørgslen!

Problemet er jo, at man i en aggregatfunktion aggregerer seperet pr. kolonne, og derfor er det ikke "bare" at smække en max på datoen.
Avatar billede overchord Nybegynder
07. oktober 2004 - 17:01 #7
Jamen max(datoen) findes afhaengig af din aggregering. Hvis du tilfoejer tblrykker.saldo til GROUP BY udtrykket burde det virke
Avatar billede brobaek Nybegynder
07. oktober 2004 - 17:05 #8
NOPE (prøv det dog!)

Hvis du grupperer på saldoen så får du jo grupperet for hver forskellige saldo (logisk nok, idet det netop er det "group by" gør).

Derfor skriver jeg også, at det er ikke _bare_ et spørgsmål om at aggregere - der skal smides et par joinede select-sætninger ind i forespørgslen...
Avatar billede skwat Praktikant
07. oktober 2004 - 17:06 #9
du kan klare den med en having then
Avatar billede skwat Praktikant
07. oktober 2004 - 17:07 #10
select tblKontonr.Kontonr, tblRykker.dato
from tblKontonr, tblRykker
where tblKontonr.Kontonr = tblRykker
group by tblKontonr.Kontonr
having tblRykker.dato = max(tblRykker.dato)
Avatar billede overchord Nybegynder
07. oktober 2004 - 17:23 #11
ok du laver 2 queries istedet fordi du ikke kan aggregere paa saldo:

Query1:
SELECT tblkonti.Kontonr, Max(tblrykker.dato) AS MaxOfdato
FROM tblkonti LEFT JOIN tblrykker ON tblkonti.Kontonr = tblrykker.Kontornr
GROUP BY tblkonti.Kontonr;

Query2:
SELECT Query1.Kontonr, Query1.MaxOfdato, tblrykker.saldo
FROM tblrykker INNER JOIN Query1 ON (tblrykker.dato = Query1.MaxOfdato) AND (tblrykker.Kontornr = Query1.Kontonr);

Resultatet vises paa i Q2.
Avatar billede jensen363 Forsker
07. oktober 2004 - 19:10 #12
SELECT tblKonti.Kontonr, tblKonti.Saldo AS Saldo_tblKonti, Sum(tblRykker.Saldo) AS Saldo_tblRykker
FROM tblKonti LEFT JOIN tblRykker ON tblKonti.Kontonr = tblRykker.Kontonr
GROUP BY tblKonti.Kontonr, tblKonti.Saldo;
Avatar billede jensen363 Forsker
07. oktober 2004 - 19:13 #13
Glemte lige datoen :

SELECT tblKonti.Kontonr, tblKonti.Saldo AS Saldo_tblKonti, Sum(tblRykker.Saldo) AS Saldo_tblRykker, Max(tblRykker.Dato) AS [Seneste rykker]
FROM tblKonti LEFT JOIN tblRykker ON tblKonti.Kontonr = tblRykker.Kontonr
GROUP BY tblKonti.Kontonr, tblKonti.Saldo;
Avatar billede brobaek Nybegynder
08. oktober 2004 - 12:13 #14
skwat: der mangler jo saldoen - den kan du ikke inkludere

jensen: læs sp. Den skal ikke sum tblRykker.Saldo

overchord: læs sp. Det skal være en (1) SQL streng, som kun forespørger i tabeller (pga. de relevante tabeller skal gives dynamisk)

OK - bare for at undgå flere misforståelser:
Medmindre jeg har overset noget meget logisk, så er det IKKE et sp. om "bare" at trykke på sum-knappen og så aggregere løs! Jeg har løst problemet ved at lave 3Q:

Q1 (finder maks-dato pr. konto)
SELECT tblRykker.Konto, Max(tblRykker.Dato) AS MaksOfDato
FROM tblRykker
GROUP BY tblRykker.Konto;

Q2 (finder saldoen for den pågældende konto på pågældende dato - dvs. maksdato):
SELECT Q1.Konto, tblRykker.Dato, tblRykker.Saldo
FROM Q1 INNER JOIN tblRykker ON (Q1.Konto = tblRykker.Konto) AND (Q1.MaksOfDato = tblRykker.Dato);

Q3:
SELECT tblKONTO.KONTONR, tblKONTO.SALDO, Q2.Dato AS RykkerDato, Q2.Saldo AS RykkerSaldo
FROM Q2 RIGHT JOIN tblKONTO ON Q2.Konto = tblKONTO.KONTONR;

Dette giver det rigtige resultat. Hvordan samles ovenstående 3 queryes i een ???

Mvh
Martin
Avatar billede jensen363 Forsker
08. oktober 2004 - 12:19 #15
Har læst spørgsmålet, og udført opgaven som spørgsmålet er formuleret ( saldo fremgår at begge tabeller, derfor et resultat med saldo for begge ) ...

Og du kan fortsat nøjes med een query ...

SELECT tblKonti.Kontonr, tblKonti.Saldo AS Saldo_tblKonti, Max(tblRykker.Dato) AS [Seneste rykker]
FROM tblKonti LEFT JOIN tblRykker ON tblKonti.Kontonr = tblRykker.Kontonr
GROUP BY tblKonti.Kontonr, tblKonti.Saldo;
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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