dbwebb-se / website

This is the main website for dbwebb.se.
https://dbwebb.se
Other
17 stars 32 forks source link

Korrigera uppg 4 om HAVING #105

Closed datalowe closed 3 years ago

datalowe commented 3 years ago

"4. Visa samma sak som i 3), men exkludera de grupper som har fler än 1 i Antal och har snittlön mellan 30 000 - 45 000. Sortera per snittlön." Instruktionen stämmer inte överens med svaret (rad 314). I svaret framgår att det är grupper som har snittlön mellan 30 000 - 45 000 som behålls.

Eftersom negationerna i min korrigering blir lite förvirrande kanske det är bättre att använda "... men behåll endast de grupper som har *färre än 2 i Antal och har snittlön mellan 30 000 - 45 000. Sortera per snittlön.".

mosbth commented 3 years ago

En del av uppgifterna kräver lite läsande och till viss del tolkning. Det är något i meningsbyggningen i denna uppgiften som kan justeras.

Men, hur tolkar du uppgiften i SQL-kod, hur ser din SQL.-kod ut för att uppgiften skall bli rätt svar?

Om du visar det så skall jag fundera över hur vi kan justera texten i uppgiften.

datalowe commented 3 years ago

Javisst,

Det här är vad jag först trodde att ni ville ha när jag läste instruktionen:

SELECT 
    avdelning, 
    kompetens,
    count(*) AS antal, 
    ROUND(avg(lon)) AS snittlon
FROM larare
WHERE kompetens <= 3
GROUP BY avdelning, kompetens
HAVING  antal <= 1 OR (snittlon NOT BETWEEN 30000 AND 45000)
ORDER BY 
    snittlon DESC;

Jag läste det alltså som att jag skulle exkludera "grupper som har fler än 1 i Antal och har snittlön mellan 30 000 - 45 000". Omvänt att jag skulle behålla enbart grupper som antingen hade färre än 2 i antal eller hade en snittlön som ligger utanför spannet 30-45 000.

När jag märkte att inga grupper exkluderas iom ovan SQL-query tänkte jag att ni kanske menat "exkludera de grupper som har fler än 1 i Antal eller har snittlön mellan 30 000 - 45 000", så jag ändrade HAVING-delen till HAVING antal <= 1 AND (snittlon NOT BETWEEN 30000 AND 45000).

När jag tittade i facit förstod jag att ni egentligen var ute efter det här:

SELECT 
    avdelning, 
    kompetens,
    count(*) AS antal, 
    ROUND(avg(lon)) AS snittlon
FROM larare
WHERE kompetens <= 3
GROUP BY avdelning, kompetens
HAVING  antal <= 1 AND (snittlon BETWEEN 30000 AND 45000) -- ändrad
ORDER BY 
    snittlon DESC;

Det ger samma svar som facit. Så det verkar som att ni tänkte ungefär som att man skulle lägga på två filter, 1) 'plocka bort avdelningar där antal > 1', och sen 2) 'behåll enbart de grupper med en snittlön mellan 30-45000'. Men det blir annorlunda i formuleringen.

mosbth commented 3 years ago

Ok, då är jag med.

Jag uppdaterar texten till följande:

  1. Visa samma sak som i 3), men exkludera de grupper som har fler än 1 deltagare och inkludera de som har snittlön mellan 30 000 - 45 000. Sortera per snittlön.