Vinnaren i pepparkakshustävlingen!
2011-09-30, 09:09
  #1
Medlem
Har suttit i några dagar men inte lyckats förstå varför svaret inte blir rätt.

d) Skriv en SQL-sats som för varje lärare anger vilka kurser de undervisar på under innevarande år. Frågan skall alltså vara dynamisk, så att året från aktuellt datum används i utsökningen! Signatur, namn och programnamn skall finnas med i resultattabellen.

SELECT sign, namn, progNamn
FROM Program, Larare
WHERE (SELECT DATENAME(year, anstDatum )) = (SELECT DATENAME(year, GETDATE()))

e) Skriv en SQL-sats som för varje kursinstans ger en sammanställning över hur mycket av kursbudgeten som är planerad. Ange kursNamn, budgetTim och differensen mellan kursbudgeten och de planerade timmarna.

SELECT kursNamn,budgetTim,-timmar+budgetTim AS [Diff]
FROM Undervisning u
JOIN (SELECT kursNamn, budgetTim, kursAnsvar FROM KursInstans ki JOIN Kurs k ON ki.kurskod = k.kurskod) kik
ON u.[sign] = kik.kursAnsvar


f) Skriv en SQL-sats som plockar ut de kurser där det är planerat för mycket timmar i förhållande till budget. Ange kursNamn och hur mycket övertid som är inplanerad.

SELECT kursNamn, (budgetTim - timmar) AS Överflöd
FROM Undervisning u
JOIN (SELECT kursNamn, budgetTim, kursAnsvar FROM KursInstans ki JOIN Kurs k ON ki.kurskod = k.kurskod) kik
ON u.[sign] = kik.kursAnsvar



Så här ser tabellerna ut
Undervisning
sign kurskod period timmar
CES NDA01G 201101 200
CES NPT021 201102 105
ULJ NPT021 201102 115
ANP NSA011 201102 200
ANP NDA01G 201101 90
SAAH NDA01G 201101 90
XYZ NDA01G 201101 28

KursInstans
kurskod period kursAnsvar budgetTim antalStud
.. .. .. ..
Larare
sign namn befattn rum e-post anstDatum


Kurs
kurskod kursNamn poäng niva


Program
progID progNamn poäng examen

programKurs
kurskod progID ar

När de två sista körs så får vi för många kurser.
Citera
2011-09-30, 10:11
  #2
Moderator
Protons avatar
Vilken DBMS är det ni använder? Det är ju skillnad på T-SQL och MySQLs dialekt, så det är en faktor som kommer påverka de förslag ni får.
Citera
2011-09-30, 10:41
  #3
Medlem
Citat:
Ursprungligen postat av Proton
Vilken DBMS är det ni använder? Det är ju skillnad på T-SQL och MySQLs dialekt, så det är en faktor som kommer påverka de förslag ni får.

Det är Microsoft SQL Server 2005


e) är löst men inte resten=/
Citera
2011-09-30, 11:22
  #4
Medlem
Fantomsmaertas avatar
Tycker det ser ut som att det saknas ett predikat i f.
Citera
2011-09-30, 11:29
  #5
Medlem
Det här är den nya;

select kursNamn, (budgetTim-SUM(timmar)) as överflöd
from (kursinstans ki
join kurs k on ki.kurskod = k.kurskod)
join undervisning u on ki.period = u.period
group by k.kurskod, k.kursNamn, ki.budgetTim
having sum(timmar) > (budgetTim-SUM(timmar))


den ger inte heller rätt värden
Citera
2011-09-30, 18:03
  #6
Medlem
Fantomsmaertas avatar
Citat:
Ursprungligen postat av sunshine88
Det här är den nya;

select kursNamn, (budgetTim-SUM(timmar)) as överflöd
from (kursinstans ki
join kurs k on ki.kurskod = k.kurskod)
join undervisning u on ki.period = u.period
group by k.kurskod, k.kursNamn, ki.budgetTim
having sum(timmar) > (budgetTim-SUM(timmar))


den ger inte heller rätt värden


Som jag uppfattar din uppgift så ska du jämföra budgetTim med Sum(Timmar)

having sum(timmar) > (budgetTim)
Citera
2011-09-30, 22:15
  #7
Medlem
d) borde väl bli något liknande om jag inte missuppfattat databasdesignen.
HTML-kod:
SELECT u.sign, l.namn, p.progNamn 
FROM Larare l
JOIN Undervisning u on u.sign = l.sign
JOIN programKurs pk on pk.kurskod = u.kurskord
JOIN Program p on p.progID = pk.prodID
WHERE 
Sen får du lägga till en WHERE-sats för att hämta året utifrån GETDATE(). Lite osäker på vilket kolumn du ska matcha året mot, anstDatum känns väl kanske inte helt rätt men det får du fundera ut själv!

Funderar lite kring hur du joinar, finns det någon anledning till att du gör en subselect? Annars bör du nog läsa på lite om JOIN
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback