Toon posts:

[SQL] Max bedrag selecteren *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo iedereen! :) Ik lees regelmatig op Tweakers.net en GoT, maar ben nu voor het eerst geregistreerd. Ik heb wat vraagjes over SQL opdrachten die ik moet maken. Ben al de gehele dag bezig maar kom er niet uit. Ik zal uitleggen wat ik heb geprobeerd en wat de bedoeling is.

Vraag 1: Wat is het hoogste bestelbedrag van elke leverancier? Geef leverancierscode en bedrag.
SQL:
1
2
3
4
SELECT leverancier.levcode, bedrag
FROM leverancier, bestelling
WHERE leverancier.levcode = bestelling.levcode
AND bedrag = (SELECT MAX(bedrag) FROM bestelling)


Dit selecteert alleen de leverancier met het hoogste bedrag, niet het hoogste bedrag van elke leverancier. Ik zou niet weten hoe ik de querie aan moet passen om hem werkend te krijgen.

Zoals ik zei heb ik nog meer vragen, maar ik zal jullie op dit moment niet te veel lastig vallen. :) Als iemand mij kan helpen zou ik erg blij zijn! Alvast heel erg bedankt.

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 08:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Dan denk ik dat je aan GROUP BY moet gaan denken.
Als je dat combineert met MAX kom je een heel eind. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 22-09 09:11
Kijk eens naar de GROUP BY statement

hallo


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:57
Ik denk dat het het beste is, dat je eens een boek / tutorial doorneemt mbt SQL ipv 'lukraak' een query te proberen.
Het helpt als je de concepten die erachter liggen, begrijpt. :)

In jouw geval kan je doen zoals Gonadan zegt: eens kijken naar de aggregate functie MAX, deze gebruiken in je SELECT list, en natuurlijk niet vergeten om te groeperen (group by) op leverancier.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op dinsdag 27 januari 2009 @ 15:48:
In jouw geval kan je doen zoals Gonadan zegt: eens kijken naar de aggregate functie MAX, deze gebruiken in je SELECT list, en natuurlijk niet vergeten om te groeperen (group by) op leverancier.
Ahh, ik probeerde de MAX de hele tijd te gebruiken in de WHERE. Nu werkt mijn querie gelukkig. :) Ik zal nog maar eerst even grondig naar mijn andere problemen kijken voordat ik hier weer post. :) Bedankt voor jullie hulp in ieder geval!

PS. Onderstaande querie is het geworden:

SELECT leverancier.levcode, MAX(bedrag) as 'bedrag'
FROM leverancier, bestelling
WHERE leverancier.levcode = bestelling.levcode
GROUP BY leverancier.levcode

Om een of andere rede mag ik niet 'MAX(bedrag) as bedrag' gebruiken. :?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hierbij wel nog even het vriendelijke verzoek voortaan een (meer) beschrijvende topictitel te kiezen (bijv. [SQL] Max bedrag selecteren). "SQL Queries - beginneling" is zo vaag.

[ Voor 39% gewijzigd door RobIII op 27-01-2009 16:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • mr_derk
  • Registratie: September 2005
  • Laatst online: 08:01
kijk ook eens op: http://sqlzoo.net/, kan je nog ff door oefenen

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hier ben ik weer, met een voor mij wel heel raar probleem. 8)7

De vraag is, welke planten zijn binnen hun soort het duurst? Mijn querie werkt perfect:

SQL:
1
2
3
SELECT soort, MAX(prijs) as 'prijs'
FROM plant
GROUP BY soort


Helaas moet ik ook de plantnaam in de tabel hebben staan. Wanneer ik van mijn querie het volgende maak:

SQL:
1
2
3
SELECT plantnaam, soort, MAX(prijs) as 'prijs'
FROM plant
GROUP BY soort


Krijg ik dit als error: You tried to execute a query that does not include the specified expression 'plantnaam' as part of an aggregate function. Dit komt doordat ik 'plantnaam' niet expliciet genoemd heb in 'GROUP BY'. Wanneer ik plantnaam echter in de GROUP BY zet werkt de querie niet meer. 8)7 Ook niet als ik plantnaam achter soort zet.
RobIII schreef op dinsdag 27 januari 2009 @ 16:05:
Hierbij wel nog even het vriendelijke verzoek voortaan een (meer) beschrijvende topictitel te kiezen (bijv. [SQL] Max bedrag selecteren). "SQL Queries - beginneling" is zo vaag.
Excuses hiervoor. Had origineel het idee om meerdere queries in de openingspost te plaatsen.

[ Voor 0% gewijzigd door Verwijderd op 27-01-2009 17:21 . Reden: SQL tags ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lees Hoe werkt dat GROUP BY nu eigenlijk? dan eens... Daar staat precies in wanneer je wel en wanneer je niet een veld in de Group By moet zetten (kort: als het geen aggregated veld is moet 'ie in de group by). Als wat jij zegt waar is (plantnaam in de group by erbij zetten) moet het gewoon werken dus je doet nog iets anders dan je zegt. En dan zou ik graag zien dat je voortaan wat duidelijker bent dan "werkt de querie niet meer. 8)7 ".

Over welk DBMS hebben we het eigenlijk? MySQL? MSSQL? Oracle? What?

En fix je code tags effe ;) (mbv van de Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif knop).

[ Voor 80% gewijzigd door RobIII op 27-01-2009 16:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op dinsdag 27 januari 2009 @ 16:45:
De vraag is, welke planten zijn binnen hun soort het duurst?
Je gebruikt denk ik SQL Server/T-SQL aan de foutmelding te zien. Voor zo'n groupwise maximum probleem kun je dan bijvoorbeeld rank() over (partition by ... gebruiken.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De laaste SQL querie van vandaag waar ik totaal niet uitkom.. :(

De vraag is, welke planten zijn binnen hun soort het duurst? Hiervoor heb ik de volgende querie:

SQL:
1
2
3
SELECT soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort


Verder moet ik in de tabel 'plantnaam' weergeven. Daarom verander ik mijn code naar

SQL:
1
2
3
SELECT plantnaam, soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort, plantnaam


Nu krijg ik echter veel te veel resultaten omdat bij elk soort een plantnaam wordt gekoppeld. Ik zie dus wel het probleem, maar weet niet hoe het op te lossen. |:( Alvast bedankt als iemand mij kan helpen!

Acties:
  • 0 Henk 'm!

  • Martine
  • Registratie: Mei 2002
  • Niet online
Waarom doe je een group by op plantnaam? Ieder plant heeft toch zijn eigen naam?

Dit zou toch gewoon moeten werken...
SQL:
1
2
3
SELECT plantnaam, soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort

[ Voor 11% gewijzigd door Martine op 27-01-2009 21:48 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Martine schreef op dinsdag 27 januari 2009 @ 21:43:
Waarom doe je een group by op plantnaam? Ieder plant heeft toch zijn eigen naam?

Dit zou toch gewoon moeten werken...
SQL:
1
2
3
SELECT plantnaam, soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort
Dat hoort niet te werken. Dat MySQL zulke zaken slikt is andere koek. Ook voor jou geldt: Hoe werkt dat GROUP BY nu eigenlijk? .

[ Voor 20% gewijzigd door RobIII op 27-01-2009 22:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 22:37
Verwijderd schreef op dinsdag 27 januari 2009 @ 20:04:
De laaste SQL querie van vandaag waar ik totaal niet uitkom.. :(

De vraag is, welke planten zijn binnen hun soort het duurst? Hiervoor heb ik de volgende querie:

SQL:
1
2
3
SELECT soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort


Verder moet ik in de tabel 'plantnaam' weergeven. Daarom verander ik mijn code naar

SQL:
1
2
3
SELECT plantnaam, soort, MAX(prijs) as 'prijs' 
FROM plant 
GROUP BY soort, plantnaam


Nu krijg ik echter veel te veel resultaten omdat bij elk soort een plantnaam wordt gekoppeld. Ik zie dus wel het probleem, maar weet niet hoe het op te lossen. |:( Alvast bedankt als iemand mij kan helpen!
En heb je toevallig al naar de links in de post boven die van jou gekeken? Want daar staat het antwoord precies in.

Acties:
  • 0 Henk 'm!

  • Martine
  • Registratie: Mei 2002
  • Niet online
RobIII schreef op dinsdag 27 januari 2009 @ 22:31:
[...]

Dat hoort niet te werken. Dat MySQL zulke zaken slikt is andere koek. Ook voor jou geldt: Hoe werkt dat GROUP BY nu eigenlijk? .
Hij's fijn ;)
Verwijderd schreef op dinsdag 27 januari 2009 @ 20:04:
... Ik zie dus wel het probleem, maar weet niet hoe het op te lossen. ....
Dan begrijp ik je probleem niet helemaal, staat alles in een tabel? of is die plantnaam een id naar een andere tabel waar die plantnaam in opgeslagen is? Geef eens wat meer informatie wat je precies wil hebben.

Doe anders eens even een voorbeeldje geven wat je precies krijgt, en wat je wil hebben.

[ Voor 9% gewijzigd door Martine op 27-01-2009 23:55 ]


Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Je hebt een subquery nodig die max(prijs) bepaalt icm soort (je bovenste query dus). En die moet je vervolgens joinen met de tabel plant op soort en prijs, om de naam (of -in geval van gelijke prijzen- meerdere namen) erbij te vinden.

En kijk voor de eerste opdracht ook eens naar de INNER JOIN, dat maakt de query wat duidelijker.

Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Op welke school zit jij? Ik heb precies dezelfde opdrachten gehad een week geleden met zelfde databases, velden etc! :o

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Ben wat roestig qua SQL maar moet je niet een HAVING statement gebruiken in combinatie met max?

http://www.webcheatsheet....l_tutorial/sql_having.php

Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Ben wel benieuwd hoe je hier HAVING voor wil gebruiken.. Gebruik het praktisch nooit en vind het een overbodig taalelement. Misschien maakt onbekend onbemind, maar alles wat ik met HAVING kan, kan ik ook met een subquery. Maar wat ik met een subquery kan, kan ik vrijwel nooit met HAVING.

Edit: Het *kan* toch met HAVING! :+
SQL:
1
2
3
4
5
select p1.plantnaam, p1.soort, p1.prijs
from plant p1
inner join plant p2 on p2.soort = p1.soort
group by p1.plantnaam, p1.soort, p1.prijs
having p1.prijs = max(p2.prijs)

[ Voor 29% gewijzigd door Cousin Boneless op 30-01-2009 14:33 ]


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik denk dat je de query als volgt moet schrijven (Ik ga er vanuit dat plantnaam de primary key is)

SQL:
1
2
3
SELECT plantnaam, soort, prijs
FROM plant
WHERE -- plantnaam is de duurste plant in zijn soort


Nu hoef je alleen nog maar een subquery te vinden voor het commentaar. Dat kan op veel manieren, maar hiermee moet je ver komen. :)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Cousin Boneless schreef op donderdag 29 januari 2009 @ 22:58:
Ben wel benieuwd hoe je hier HAVING voor wil gebruiken.. Gebruik het praktisch nooit en vind het een overbodig taalelement. Misschien maakt onbekend onbemind, maar alles wat ik met HAVING kan, kan ik ook met een subquery. Maar wat ik met een subquery kan, kan ik vrijwel nooit met HAVING.
Dan kun je je ook afvragen waarom er bijvoorbeeld in Java een for-each en een for loop bestaan, als je die ook kunt vervangen met een while loop en je met deze laatste nog meer mogelijkheden hebt ook. Of je vergelijkt gewoon de for-each met de for loop, daarbij heeft de for-loop ook meer mogelijkheden. Meestal is de reden te beschrijven in één woord: gemak.
Pagina: 1