Toon posts:

SQL Probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem:

ik heb de tabel orders -- met daarin orderid en klantid.
ik heb de tabel orderregels -- met daarin orderid, aantal, prijs
ik heb de tabel klanten -- met daarin naam en klantid.

klanten kunnen dus orders plaatsen. en de tabel orderregels bevat de informatie per order. Nu wil ik kijken welke klant de grootste order heeft geplaatst en wat de totaalprijs van die order is.

Ik heb al van alles geprobeerd, maar ik kom er niet uit.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

lijkt me ten eerste een verkeerd database ontwerp.

Wat doet klantid in de orderregels? orderregels horen toch bij een order? Dat die dan op zijn beurt weer bij een klant hoort is een bijzaak.

orderregels hebben geen (unieke) primary key. Dat lijkt me zo ie zo onverstandig.

verder zou ik voor je oplossing eens naar de sql begrippen 'group', 'count' en 'max' kijken...

Geef ook eens de SQL die je al wel had verzonnen

[ Voor 12% gewijzigd door LordLarry op 17-12-2002 12:15 ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

ik snap je model niet echt... wat jij wil kan je met alleen een orders tabel en een klanten tabel toch ook bereiken? een order wordt maar door 1 klant gedaan

Verwijderd

Topicstarter
je hebt gelijk .. was een typefout.. orderregels bevat geen klantid

Verwijderd

Topicstarter
Verwijderd schreef op 17 December 2002 @ 12:15:
ik snap je model niet echt... wat jij wil kan je met alleen een orders tabel en een klanten tabel toch ook bereiken? een order wordt maar door 1 klant gedaan
mwah... ik heb maar een klein stukje uit de db geknipt. hij is helemaal genormaliseerd.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

offtopic:
waarom komt er bij jouw geen ___edit:___ te staan?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

dus je wil een veel op veel relatie tussen klanten en orders.. okay

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Deel het probleem eens op in stukjes, kan je een query maken die de orderid met het grootste aantal geeft? kan je dan de prijs daarvan tonen? kan je er dan een klant aan koppelen?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 17 december 2002 @ 12:20:
Deel het probleem eens op in stukjes, kan je een query maken die de orderid met het grootste aantal geeft?
dit is juist het stukje dat me niet lukt. de rest zal vast wel lukken.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:56

Dido

heforshe

Schot voor de boeg :)
code:
1
2
3
4
5
6
7
8
SELECT c.klantid, sum(b.aantal * b.prijs) as regelprijs
  FROM orders      a,
       orderregels b,
       klanten     c
 WHERE c.klantid = a.klantid
   AND a.orderid = b.orderid
 GROUP BY c.klantid
 ORDER BY regelprijs DESC


Je eerste record is degene die je zoekt als't goed is...

[ Voor 10% gewijzigd door Dido op 17-12-2002 13:21 ]

Wat betekent mijn avatar?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

the_predaor: nogmaals de vraag: wat heb je al geprobeerd? Al iets met group, count en max geprobeerd?

dido: hehe, beetje zonde als je het nu voorzegt :)

[ Voor 28% gewijzigd door LordLarry op 17-12-2002 13:23 ]

We adore chaos because we like to restore order - M.C. Escher


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 27-08 10:59

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op 17 December 2002 @ 13:13:
[...]


dit is juist het stukje dat me niet lukt. de rest zal vast wel lukken.
Misschien een idee om eerst een view te maken waarin je het aantal (en de prijs) per order sommeert en daar een select-statement overheen om de hoogste te selecteren.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:56

Dido

heforshe

LordLarry schreef op 17 december 2002 @ 13:22:
dido: hehe, beetje zonde als je het nu voorzegt :)

sorry :) macht der gewoonte... zit hier al een paar uur SQL te rammen, dus ram ik in een moeite door.

Overigens is die wuery volledig ongetest en geef ik geen enkele garantie dat ie uberhaupt wat doet :P

Wat betekent mijn avatar?


Verwijderd

Topicstarter
hij werkt prima... thks...

ik had zelf al van alles zitten proberen met inner join en count... maar ik kwam er niet uit.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als dit een SQL opdracht was had je 'em op moet lossen met een group by en een having.

Who is John Galt?


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Dido schreef op 17 December 2002 @ 13:21:
Schot voor de boeg :)
code:
1
2
3
4
5
6
7
8
SELECT c.klantid, sum(b.aantal * b.prijs) as regelprijs
  FROM orders      a,
       orderregels b,
       klanten     c
 WHERE c.klantid = a.klantid
   AND a.orderid = b.orderid
 GROUP BY c.klantid
 ORDER BY regelprijs DESC


Je eerste record is degene die je zoekt als't goed is...
Dit statement is bijna goed.
Het sommeert echter over alle orders van een klant.
Dus als een klant 10 orders van € 5.000,= plaatst komt deze hoger uit dan een klant die 1 order van € 20.000,= plaatst. Ik weet niet of dit de bedoeling was.

Volgens mij mist er in de group by een "b.orderid"
Die HAVING die justmental noemde heb je niet nodig

  • Freee!!
  • Registratie: December 2002
  • Laatst online: 27-08 10:59

Freee!!

Trotse papa van Toon en Len!

Goodielover schreef op 17 december 2002 @ 16:45:
[...]
Dit statement is bijna goed.
Het sommeert echter over alle orders van een klant.
Dus als een klant 10 orders van € 5.000,= plaatst komt deze hoger uit dan een klant die 1 order van € 20.000,= plaatst. Ik weet niet of dit de bedoeling was.

Volgens mij mist er in de group by een "b.orderid"
Die HAVING die justmental noemde heb je niet nodig
Dido zal niet blij zijn >:) maar je hebt gelijk.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:56

Dido

heforshe

code:
1
2
3
4
5
6
7
8
SELECT c.klantid, b.orderid, sum(b.aantal * b.prijs) as orderwaarde
  FROM orders      a,
       orderregels b,
       klanten     c
 WHERE c.klantid = a.klantid
   AND a.orderid = b.orderid
 GROUP BY c.klantid, b.orderid
 ORDER BY orderwaarde DESC

Zo zou ie inderdaad beter moeten lopen...
De eerste query gaf inderdaad de klant die in het totaal het meest besteld had, niet de grootste order.
Ik betwijfel echter of nu je order by het allemaal leuk gaat vinden :(
Ik word hier inderdaad niet zo heel vrolijk van :P

Wat betekent mijn avatar?


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Goodielover schreef op 17 december 2002 @ 16:45:
Die HAVING die justmental noemde heb je niet nodig
Ik wil bij deze de topicstarter verzoeken het commentaar van de docent op de uitwerking van z'n opdracht te posten :P
Geheid dat ie een subquery of een having had willen zien.
Deze query's voldoen namelijk niet exact aan de opdracht.

[ Voor 19% gewijzigd door justmental op 17-12-2002 17:21 ]

Who is John Galt?


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Hmm ik zou LIMIT gebruiken..

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Dash2in1 schreef op 17 december 2002 @ 18:19:
Hmm ik zou LIMIT gebruiken..

Waarom LIMIT combineren met een ORDER als je toch al GROUP BY hebt en je in de HAVING de MAX() functie kan gebruiken :?

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Hmm dat is een goede, ik hield er ff geen rekening mee dat order by alles sorteert hehehe. having is the way to go :)

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Glimi schreef op 17 December 2002 @ 18:24:

[...]

Waarom LIMIT combineren met een ORDER als je toch al GROUP BY hebt en je in de HAVING de MAX() functie kan gebruiken :?
Da's helemaal geen goede, Dash2in1.
Je kan in de having alleen conditie's kwijt op de data NA de GROUP BY, dus in dit geval bijvoorbeeld: HAVING sum(....) > 10000
Je kan daar geen orderby of een MAX in kwijt als die niet ook in de select staat.

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Wat verstaat de topicstarter precies onder de grootste order?
Het grootste aantal?
De grootste prijs?
De grootste aantal x prijs?
Pagina: 1