[SQL] Query probleempje...

Pagina: 1
Acties:

  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Ik moet een query maken die de datum van de laatste donatie en de datum van inschrijving van de donateur terug geeft. Dit is voor een project op school. Dit is een groot database programma voor de dierenambulance en dit is de enige query waar ik niet uitkom... Ik ben nog een beetje n00b in SQL zeg maar... :D

Dit had ik bedacht, maar het werkt niet:

SELECT Donateur.datumtoetreding FROM donateur INNER JOIN (SELECT MAX Donatie.datumdonatie FROM donatie) WHERE Donateur.donnr = 529 AND Donateur.donnr = Donatie.donnr;

Wie kan me helpen?

  • Greyfox
  • Registratie: Januari 2001
  • Laatst online: 24-08 20:15

Greyfox

MSX rulez

Je moet hiervoor een MAX en een GROUP BY gebruiken.

En kijk even de syntax van JOINs na.

[ Voor 29% gewijzigd door Greyfox op 06-02-2003 15:01 ]

MSX 2 rulez more


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Waarom een GROUP? Ik krijg maar één record terug toch? Dat is wat ik wil tenminste...

  • IceStorm
  • Registratie: Februari 2000
  • Laatst online: 24-08 20:34

IceStorm

This place is GoT-like!!!

Je wilt maar 1 resultaat he? Mijn SQL is niet echt goed (lees slecht :P) maar je kunt toch
SELECT bla FROM blah WHERE blah desc limit 1

De rest zul je er zelf even om heen moeten breien maar op deze manier kun je (toch?) aangeven dat ie een lijst moet maken met de laatste datum eerst en bij 1 result op mag houden.
Of ben ik echt veels te fout aan het denken?

  • AK47
  • Registratie: Juli 2001
  • Laatst online: 04-05-2024
Als je gewoon gaat sorteren op je veld waar het grootste bovenaan moeten komen te liggen, en daar 1 rij uithaald

Dan zou je zoiets krijgen:

SELECT Donateur.datumtoetreding FROM donateur ORDER BY Donateur.datumtoetreding DESC

  • Greyfox
  • Registratie: Januari 2001
  • Laatst online: 24-08 20:15

Greyfox

MSX rulez

Benadski schreef op 06 februari 2003 @ 15:03:
Waarom een GROUP? Ik krijg maar één record terug toch? Dat is wat ik wil tenminste...
Nou, je wilt de laatste datum.
Dus in feite wil je per donateur 1 record met info terug en dus geen order by want dan krijg je alle informatie.
Dus het wordt dan iets van.

Select MAX(Datum)
From donateurs
Group By Donateurs.ID

MSX 2 rulez more


  • IceStorm
  • Registratie: Februari 2000
  • Laatst online: 24-08 20:34

IceStorm

This place is GoT-like!!!

Greyfox schreef op 06 February 2003 @ 15:12:
Nou, je wilt de laatste datum.
Dus in feite wil je per donateur 1 record met info terug en dus geen order by want dan krijg je alle informatie.
Dus het wordt dan iets van.

Select MAX(Datum)
From donateurs
Group By Donateurs.ID

Hij wil nie tper donateur 1 record terug, hij wil maar 1 record terug ;)

  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Een donateur heeft één of meerdere donaties (gekoppeld via het donnr) en van die donaties wil ik de meest recente (datumdonatie).

Aan die datum kan ik dan zien of ik ze een rekening moet sturen of niet, daar gaat het om.

Code voor VB gemaakt (die nog niet helemaal klopt):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Function JaarVoorbij(currentID As Integer) As Boolean
    Dim Query As String
    Dim rsData As New ADODB.Recordset     'het recordset om de gegevens binnen te halen
    Dim vandaagwaarde As Long
    Dim donatiewaarde As Long
    Dim inschrijfwaarde As Long
    
    Query = "SELECT Donateur.datumtoetreding FROM donateur INNER JOIN (SELECT MAX " & _
    "Donatie.datumdonatie FROM donatie) WHERE Donateur.donnr = " & currentID & _
    " AND Donateur.donnr = Donatie.donnr;"
    If Not clsDatabase.GetData(rsData, Query, adOpenKeyset, adLockOptimistic) Then Exit Function
    
    vandaagwaarde = 12 * Year(Date$) + Month(Date$)
    donatiewaarde = 12 * Year(rsData!datumdonatie) + Month(rsData!datumdonatie)
    inschrijfwaarde = 12 * Year(rsData!datumtoetreding) + Month(rsData!datumtoetreding)
    
    clsDatabase.CloseRecordset rsData

    If (vandaagwaarde - 12 * Int((donatiewaarde - inschrijfwaarde) / 12) - inschrijfwaarde) > 12 Then
        JaarVoorbij = True
    Else
        JaarVoorbij = False
    End If
End Function


EDIT: Deze is me wel zelf gelukt: :)
code:
1
2
3
4
5
6
Query = "SELECT Donateur.donnr, Client.voornaam, Client.tussenvoegsel, Client.achternaam, " & _
        "Donateur.email, Donateur.bankgironummer, Donateur.datumtoetreding, Donateur.doncode, " & _
        "SUM(Donatie.bedragdonatie) FROM (Client INNER JOIN Donateur ON Client.donnr = " & _
        "Donateur.donnr) LEFT OUTER JOIN Donatie ON donateur.donnr = donatie.donnr GROUP BY " & _
        "Donateur.donnr, Client.voornaam, Client.tussenvoegsel, Client.achternaam, Donateur.email, " & _
        "Donateur.bankgironummer, Donateur.datumtoetreding, Donateur.doncode; "

[ Voor 21% gewijzigd door Benadski op 06-02-2003 15:21 ]


  • momania
  • Registratie: Mei 2000
  • Laatst online: 10:17

momania

iPhone 30! Bam!

Zoiets misschien?
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
  MAX( Donatie.datumdonatie ),
  Donateur.datumtoetreding
FROM
  (Donatie 
     JOIN Donateur ON Donatie.donnr = Donateur.donnr)
WHERE
   Donateur.donnr = xxxxx
GROUP BY
  Donatie.donnr;

[ Voor 3% gewijzigd door momania op 06-02-2003 15:37 ]

Neem je whisky mee, is het te weinig... *zucht*


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 00:31

The Eagle

I wear my sunglasses at night

He Benadski. Lang niet gesproken...Ik denk dat je er es ff je moduleboek DB-01 of DB-02 van I&I op na moet slaan, als je die nog hebt. Moet het volgens mij wel in uitgelegd zijn.
Sinds wanneer doen ze bij MSEO trouwens iets met SQL op dit niveau??

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Ehhm, dat moduleboek heb ik helaas niet meer, daar had ik al naar gezocht.

Op MESO doen we niet alleen elektro hoor, ik ben nu bezig met een softwareproject (een ander z'n werk (580 A4 tjes code) debuggen :(). Ik heb nu dus niets met elektro te maken...

Die query werkt helaas niet momania... Denk omdat bij de from geen donateur staat?!? Waar moet dat (of is het wat anders)?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 10:17

momania

iPhone 30! Bam!

Benadski schreef op 06 februari 2003 @ 15:35:
Die query werkt helaas niet momania... Denk omdat bij de from geen donateur
staat?!? Waar moet dat (of is het wat anders)?
Ik zie het, die Donateur moet tussen JOIN en ON nog een keer.... [ge-edit]

Neem je whisky mee, is het te weinig... *zucht*


  • esf
  • Registratie: Juni 2002
  • Laatst online: 11-03 14:06

esf

Je kan iets als het volgende gebruiken:

SELECT dd.datumdonatie, d.datumtoetreding FROM Donateur d, Donatie dd
WHERE d.donnr = dd.donnr
ORDER BY dd.datumdonatie DESC
LIMIT 1

Of in plaats van carthesisch produkt een natural join gebruiken..

The hardest thing in the world to understand is the income tax. - Albert Einstein


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
momania: Helaas, het werkt niet :'(

esf: ik heb m zo dus geprobeerd omdat het donnr gelijk moet zijn aan currentID:

Query = "SELECT Donatie.datumdonatie, Donateur.datumtoetreding FROM donatie, donateur WHERE Donateur.donnr = Donatie.donnr AND Donateur.donnr = " & currentID & " ORDER BY donatie.datumdonatie DESC LIMIT 1;"

maar dat gaat ook niet goed ;(

  • IceStorm
  • Registratie: Februari 2000
  • Laatst online: 24-08 20:34

IceStorm

This place is GoT-like!!!

esf schreef op 06 February 2003 @ 15:43:
Je kan iets als het volgende gebruiken:

SELECT dd.datumdonatie, d.datumtoetreding FROM Donateur d, Donatie dd
WHERE d.donnr = dd.donnr
ORDER BY dd.datumdonatie DESC
LIMIT 1

Of in plaats van carthesisch produkt een natural join gebruiken..

Woei, zie je wel, dat bedoelde ik dus alleen is deze iets netter uitgewerkt ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 24-08 16:37
esf schreef op 06 February 2003 @ 15:43:
Je kan iets als het volgende gebruiken:

SELECT dd.datumdonatie, d.datumtoetreding FROM Donateur d, Donatie dd
WHERE d.donnr = dd.donnr
ORDER BY dd.datumdonatie DESC
LIMIT 1

Of in plaats van carthesisch produkt een natural join gebruiken..


Waar gebruik je een carthesisch produkt dan?
Een cartesisch produkt krijg je als je helemaal niet joined, dus, select uit 2 tabellen en nergens (niet in de WHERE, niet mbhv een JOIN clause) aangeeft hoe die tabellen moeten gejoined worden.
Je krijgt dan n x m aantal records terug. (Voor ieder record in tabel1 ieder record uit tabel2).

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 24-08 16:37
code:
1
2
3
4
5
SELECT MAX(datum), donnateur
FROM ....
WHERE .....
GROUP BY donnateur
ORDER BY 1

Dan heb je per donnateur alle maximale datums. De hoogste datum staat dan vanboven, dus het enige wat je dan nog hoeft te doen is de resultset te beperken. Afhankelijk van je DBMS gebruik je daarvoor een TOP (SQL Server, MSDE) of LIMIT (MySQL) clausule.

https://fgheysels.github.io/


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08:23

Tomatoman

Fulltime prutser

whoami schreef op 06 February 2003 @ 15:58:
[...]
De hoogste datum staat dan vanboven, dus het enige wat je dan nog hoeft te doen is de resultset te beperken. Afhankelijk van je DBMS gebruik je daarvoor een TOP (SQL Server, MSDE) of LIMIT (MySQL) clausule.
Of:

SELECT FIRST(MAX(datum), donnateur)
FROM ....
WHERE .....
GROUP BY donateur
ORDER BY 1

Een goede grap mag vrienden kosten.


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Waarom werken ze nou geen van allen?!? Misschien ben ik wel een n00b in query's, maar waarom werkt het onderstaande niet (MS Access slikt het niet)?

code:
1
2
3
Query = "SELECT MAX (Donatie.datumdonatie), Donateur.datumtoetreding 
FROM (donateur INNER JOIN donatie ON Donateur.donnr = Donatie.donnr) 
WHERE Donatie.donnr = " & currentID & ";"


currentID = het donateurnr waarop gezocht moet worden!

EDIT: Kan het zijn dat er geen MAX gedaan kan worden op een Date/Time data type? Of is dat bullshit...

[ Voor 32% gewijzigd door Benadski op 06-02-2003 16:20 ]


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Sorry, het is helaas niet gelukt... MAX(date/time) gaat niet. :(

Dus heb ik het maar anders aangepakt!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Query = "SELECT Donateur.datumtoetreding, Donatie.datumdonatie FROM (donateur INNER 
JOIN donatie ON Donateur.donnr = Donatie.donnr) WHERE Donatie.donnr = " & currentID & ";"
If Not clsDatabase.GetData(rsData, Query, adOpenKeyset, adLockOptimistic) Then Exit Function
    
If rsData.RecordCount >= 1 Then
    For rsTeller = 1 To rsData.RecordCount
        donatiewaarde = 12 * Year(rsData!datumdonatie) + Month(rsData!datumdonatie)
        If donatiewaarde > hoogstewaarde Then hoogstewaarde = donatiewaarde
        If Not rsTeller = rsData.RecordCount Then rsData.MoveNext
    Next rsTeller
Else
    JaarVoorbij = True
    Exit Function
End If


Toch nog bedankt voor de moeite! :)

[ Voor 10% gewijzigd door Benadski op 07-02-2003 13:49 . Reden: code opgeschoond! ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 24-08 16:37
Benadski schreef op 06 februari 2003 @ 16:09:
Waarom werken ze nou geen van allen?!? Misschien ben ik wel een n00b in query's, maar waarom werkt het onderstaande niet (MS Access slikt het niet)?

code:
1
2
3
Query = "SELECT MAX (Donatie.datumdonatie), Donateur.datumtoetreding 
FROM (donateur INNER JOIN donatie ON Donateur.donnr = Donatie.donnr) 
WHERE Donatie.donnr = " & currentID & ";"


currentID = het donateurnr waarop gezocht moet worden!

EDIT: Kan het zijn dat er geen MAX gedaan kan worden op een Date/Time data type? Of is dat bullshit...


Welke foutmelding geeft hij...
Ohh, ik weet het al. ;)
Iets met aggregated functions en groups?

Als je iets overneemt , moet je het ook goed overnemen. -> ik had toch nog een GROUP BY clausule in m'n query? Die staat er niet voor niets.

Trouwens, jouw oplossing is echt niet goed. :P

[ Voor 3% gewijzigd door whoami op 07-02-2003 14:27 ]

https://fgheysels.github.io/


  • Benadski
  • Registratie: November 2001
  • Laatst online: 11-08 20:35
Mijn oplossing niet goed?! Werkt anders wel perfect! Ja, je moet misschien de rest van de functie JaarVoorbij zien wil je het echt snappen hoe het werkt... (In donatiewaarde komt de hoogste datumwaarde (aantal maanden na jaar 0,0)) te staan van de donaties bij de donateur waarvan ik het wil hebben. Is er nog geen donatie ontvangen dan moet er een acceptgiro komen (functie = true, exit). Met de datumwaarde ga ik verder rekenen om te kunnen bepalen of iemand die al gedoneert heeft weer moet betalen (jaar voorbij).

't Is misschien niet helemaal netjes, maargoed, lekker boeiend. :P

EDIT: Oja, ik krijg geen foutmelding te zien. Kan ik die ergens opvragen???

[ Voor 7% gewijzigd door Benadski op 07-02-2003 17:38 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 24-08 16:37
[nohtml]
Benadski schreef op 07 februari 2003 @ 17:36:
Mijn oplossing niet goed?! Werkt anders wel perfect!
Ze werkt misschien wel perfect, maar het is niet de goeie manier.
Je haalt teveel informatie op en dan loop je door je recordset. Dat is een veel tragere manier dan gewoon in 1 keer het juiste resultaat uit de DB te halen.
Ja, je moet misschien de rest van de functie JaarVoorbij zien wil je het echt snappen hoe het werkt... (In donatiewaarde komt de hoogste datumwaarde (aantal maanden na jaar 0,0)) te staan van de donaties bij de donateur waarvan ik het wil hebben.
Da's me een simpele query op te halen.
Zie m'n vorige posts.

https://fgheysels.github.io/

Pagina: 1