Archief - PL/SQL Minste aantal bepalen.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

a143290

Legacy Member
Even een vraag over een PLSQL functie. Ik heb volgende tabel OPNAME:

Code:
"ROLNR"	"NEGNR"	"DATUM"	"PRIJS"
115	4	17/07/80	575
115	5	17/07/80	690
115	12	18/07/80	230
127	5	27/06/83	460
127	10	27/06/83	575
127	15	27/06/83	690
127	20	28/06/83	230
135	15	15/01/87	""
135	16	15/01/87	""
175	7	09/02/92	345
176	4	10/02/92	230
176	5	""	402,5
176	20	28/02/92	207
176	22	28/02/92	258,75
180	13	21/03/92	287,5
180	21	21/03/92	345
180	22	21/03/92	345
225	7	12/12/94	345
225	12	12/12/94	287,5
135	17	16/01/87	172,5

Ik moet een functie schrijven die de rolnummer terug geeft die het minst aantal voorkomt. In dit concreet geval moet dus het nummer 175 terug gegeven worden. Voorlopig heb ik deze code:

Code:
CREATE OR REPLACE 
FUNCTION KLEINSTE_FOTOROL 
RETURN NUMBER 
AS 
v_rolnr NUMBER;
BEGIN

  SELECT COUNT(DISTINCT rolnr)
  INTO v_rolnr
  FROM OPNAME
  
  RETURN v_rolnr;
  
END KLEINSTE_FOTOROL;

Maar dit geeft gewoon als resultaat "7" terug natuurlijk. Volgens mij moet ik hier een join gebruiken, maar ik zie niet hoe...

Alvast bedankt.

Cycloon

Legacy Member
Meest straightforward query die ik op 2 seconden kon bedenken:

Code:
SELECT RolNr INTO v_rolnr FROM
( SELECT RolNr, Count(1) As Aantal FROM Opname GROUP BY RolNr )
WHERE Aantal = Min(Aantal)

Enigste probleem dat je nog kan hebben is wanneer het kleinste aantal bij meerdere rolnr's voorkomt. Je kan dat eventueel nog oplossen met een extra GROUP BY Aantal.

a143290

Legacy Member
Even dit geschreven als test:

Code:
select rolnr, count(*)
from opname group by rolnr
order by count(*) asc

Maar ik heb enkel de eerste rij nodig.
Where rownum = 1 werkt niet. (Geeft een syntax fout)

a143290

Legacy Member
Ah, merci van mij in de juiste richting te duwen. Ik heb hem gevonden nu:

Code:
CREATE OR REPLACE 
FUNCTION KLEINSTE_FOTOROL 
RETURN NUMBER 
AS 
v_rolnr NUMBER;
v_tmp NUMBER;
BEGIN

  select rolnr into v_rolnr
  from
  (
    select rolnr, count(*)
    from opname
    GROUP BY rolnr
    order by count(*) asc
  )
  where rownum = 1;
  
  RETURN v_rolnr;
  
END KLEINSTE_FOTOROL;

Cycloon

Legacy Member
Het enige wat ik nog zou doen is de count(*) vervangen door count(1) :)

pieta

Legacy Member
Cycloon zei:
Het enige wat ik nog zou doen is de count(*) vervangen door count(1) :)

waarom? is toch hetzelfde? (buiten dat 1 intern vertaald wordt naar *)


-net wa opgezocht en blijkbaar zijn er veel 'discussies' rond
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan