voulaji Δημοσ. 6 Δεκεμβρίου 2009 Δημοσ. 6 Δεκεμβρίου 2009 Προσπαθώ να υλοποιήσω ένα ερωτημα σε μια ΒΔ. Αφορά έναν πίνακα της ΒΔ : Προϊσταμενος ( ονομα_ιατρου, όνομα_προϊσταμένου ). Το ερώτημα είναι το εξής: " Δώστε αύξηση 30% σε όλους τους προϊστάμενους εκτός εάν ο νέος μισθός του προϊσταμένου που προκύπτει υπερβεί το ποσό των 30000 . Σε αυτή την περίπτωση δώστε αύξηση 4% " Νομίζω χρειάζεται η case, αλλά δεν μπορώ να το υλοποιήσω.
Blondeamon Δημοσ. 6 Δεκεμβρίου 2009 Δημοσ. 6 Δεκεμβρίου 2009 Πρέπει φυσικά να μας δώσεις και τα details των άλλων πινάκων. Που είναι αποθηκευμένοι οι μισθοί κλπ
voulaji Δημοσ. 6 Δεκεμβρίου 2009 Μέλος Δημοσ. 6 Δεκεμβρίου 2009 Διαμένει (όνομα_ιατρού, οδός, πόλη) Εργάζεται (όνομα_ιατρού, όνομα_νοσοκομείου, μισθός) Παράρτημα (όνομα_νοσοκομείου, πόλη)
Blondeamon Δημοσ. 6 Δεκεμβρίου 2009 Δημοσ. 6 Δεκεμβρίου 2009 UPDATE WORKS SET SALARY=SALARY*1.3 WHERE SALARY*1.3<30000 AND WORKS.DOC_NAME IN (SELECT P.PROISTAMENOS_NAME FROM PROISTAMENOS P) Το τελευταίο ελέγχει οτι θα αλλάξεις μόνο τους προιστάμενους και όχι όλους τους γιατρούς. Αυτό θα ελέγξει αν ξεπεράσεις τις 30.000 και θα επιτρέψει την αλλαγή αν όχι. Για να κάνεις την δεύτερη δουλειά μπορείς να κάνεις ένα παρόμοιο update. Αλλά σε τι dmbs δουλεύεις? Υπάρχουν πιο γρήγοροι τρόποι με ενα command αλλά πιο σύνθετοι. Και γενικά το schema της βάσης σου είναι κακοστημένο, θέλει αλλαγή απτην αρχή λογω του redundant information oπως πχ το ονομα_ιατρου που υπάρχει παντού κλπ Υ.Γ Στο ΜΠΕΣ σπουδάζεις? Είχαμε ακριβώς ίδια άσκηση παλιά.
voulaji Δημοσ. 7 Δεκεμβρίου 2009 Μέλος Δημοσ. 7 Δεκεμβρίου 2009 ευχαριστώ πολύ για την βοήθεια ΥΓ: αλήθεια το ΜΠΕΣ τί είναι?
Blondeamon Δημοσ. 7 Δεκεμβρίου 2009 Δημοσ. 7 Δεκεμβρίου 2009 Η σχολή μου, προφανώς δεν είσαι απο εκεί χεχε.
voulaji Δημοσ. 11 Δεκεμβρίου 2009 Μέλος Δημοσ. 11 Δεκεμβρίου 2009 σχετικά με την πιο πάνω ασκηση, δυο άλλα υποερωτήματα μου τα θεώρησε ο καθηγητής λάθος: 1. Βρείτε το όνομα του νοσοκομείου με το μεγαλύτερο αριθμό ιατρών SELECT όνομα_νοσοκομείου, count(όνομα_ιατρού) as doctors FROM Εργάζεται GROUP BY όνομα_νοσοκομείου ORDER BY doctors DESC LIMIT 1; 2. Για κάθε προϊστάμενο, βρείτε το όνομα του ιατρού με το μικρότερο μισθό του οποίου προΐσταται. (Το ερώτημα να εμφανίζει το όνομα του προϊστάμενου, το όνομα του ιατρού και τον μισθό του.) SELECT a.όνομα_προϊσταμένου , b.όνομα_ιατρού, b.μισθός from Προϊστάμενος a, Εργάζεται b Where a.όνομα_ιατρού=b.όνομα_ιατρού and b.μισθός = (select min(f.μισθός) from Εργάζεται f where f.όνομα_ιατρού in (select e.όνομα_ιατρού from Προϊστάμενος e left join Εργάζεται d on e.όνομα_ιατρού= d.όνομα_ιατρού where e.όνομα_προϊσταμένου=a.όνομα_προϊσταμένου)) Μπορεί κάποιος να μου δώσει κάτι διαφορετικό?
sotospez Δημοσ. 13 Δεκεμβρίου 2009 Δημοσ. 13 Δεκεμβρίου 2009 1. Βρείτε το όνομα του νοσοκομείου με το μεγαλύτερο αριθμό ιατρών SELECT top 1 όνομα_νοσοκομείου, count(όνομα_ιατρού) as doctors FROM Εργάζεται GROUP BY όνομα_νοσοκομείου ORDER BY count(όνομα_ιατρού) DESC; [ έτσι δουλεύει σε MsSql το limit Νομίζω είναι της oracle ] 2. Για κάθε προϊστάμενο, βρείτε το όνομα του ιατρού με το μικρότερο μισθό του οποίου προΐσταται. (Το ερώτημα να εμφανίζει το όνομα του προϊστάμενου, το όνομα του ιατρού και τον μισθό του.) SELECT a.όνομα_προϊσταμένου ,min( b.όνομα_ιατρού) , min(b.μισθός ) from Προϊστάμενος a, Εργάζεται b Where a.όνομα_ιατρού=b.όνομα_ιατρού group by a.όνομα_προϊσταμένου or SELECT a.όνομα_προϊσταμένου ,b.όνομα_ιατρού,b.μισθός from Προϊστάμενος a, (select b.όνομα_ιατρού , min(b.μισθός ) from Εργάζεται group by b.όνομα_ιατρού ) b Where a.όνομα_ιατρού=b.όνομα_ιατρού
Aztec Δημοσ. 13 Δεκεμβρίου 2009 Δημοσ. 13 Δεκεμβρίου 2009 SELECT όνομα_νοσοκομείου, count(όνομα_ιατρού) as doctors FROM Εργάζεται GROUP BY όνομα_νοσοκομείου ORDER BY doctors DESC LIMIT 1; Για το πρώτο το λάθος είναι ότι μπορεί να υπάρχουν δύο ή περισσότερα νοσοκομεία με τον μεγαλύτερο αριθμό ιατρών. Πέντε νοσοκομεία δηλαδή να έχουν απο 10 ιατρούς. Με τα συγκεκριμένα query θα εμφανιστεί μόνο το ένα.Παίζει το query δηλαδή αλλα έχει το λάθος που είπα. [ έτσι δουλεύει σε MsSql το limit Νομίζω είναι της oracle ] Η oracle δεν έχει limit ούτε top αλλα rownum ---------- Το μήνυμα προστέθηκε στις 23:59 ---------- Για το δεύτερο θα κάνω μια μετατροπή στο query που έχεις δώσει. Με bold φαίνεται η αλλαγή στο correlated query. SELECT a.όνομα_προϊσταμένου , b.όνομα_ιατρού, b.μισθόςfrom Προϊστάμενος a, Εργάζεται b Where a.όνομα_ιατρού=b.όνομα_ιατρού and b.μισθός = (select min(f.μισθός) from Εργάζεται f where f.όνομα_ιατρού in (select e.όνομα_ιατρού from Προϊστάμενος e left join Εργάζεται d on e.όνομα_ιατρού= d.όνομα_ιατρού where e.όνομα_προϊσταμένου=a.όνομα_προϊσταμένου)) σε SELECT a.όνομα_προϊσταμένου , b.όνομα_ιατρού, b.μισθός from Προϊστάμενος a, Εργάζεται b Where a.όνομα_ιατρού=b.όνομα_ιατρού and b.μισθός = (select min(f.μισθός) from Εργάζεται f , Προϊστάμενος t where t.όνομα_ιατρού=f.όνομα_ιατρού and t.όνομα_προϊσταμένου=a.όνομα_προϊσταμένου) Άσχετο σας μαθαίνουν την SQL/92 syntax?
fotisman Δημοσ. 15 Δεκεμβρίου 2009 Δημοσ. 15 Δεκεμβρίου 2009 Για το πρώτο: >SELECT εργαζεται.ονομα_νοσοκομείου, count(*) FROM διαμενει, εργαζεται WHERE διαμενει.ονομα_ιατρού = εργαζεται.ονομα_ιατρου GROUP BY εργάζεται.ονομα_νοσοκομειου HAVING count(*) >=all (SELECT count(*) FROM διαμένει, εργαζεται WHERE διαμένει.ονομα_ιατρου=εργαζεται.ονομα_ιατρου GROUP BY εργαζεται.ονομα_νοσοκομείου) ORDER BY 2,1 DESC Έτσι θα εμφανιστούν ολα τα νοσοκομεία με τους περισσοτερους ιατρούς (αν είναι πάνω απο 1 και ο αριθμος των γιατρών ισοψηφεί).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.