Προς το περιεχόμενο

sql


voulaji

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώ να υλοποιήσω ένα ερωτημα σε μια ΒΔ. Αφορά έναν πίνακα της ΒΔ : Προϊσταμενος ( ονομα_ιατρου, όνομα_προϊσταμένου ). Το ερώτημα είναι το εξής:

" Δώστε αύξηση 30% σε όλους τους προϊστάμενους εκτός εάν ο νέος μισθός του προϊσταμένου που προκύπτει υπερβεί το ποσό των 30000 . Σε αυτή την περίπτωση δώστε αύξηση 4% "

 

Νομίζω χρειάζεται η case, αλλά δεν μπορώ να το υλοποιήσω.

Δημοσ.

Διαμένει (όνομα_ιατρού, οδός, πόλη)

Εργάζεται (όνομα_ιατρού, όνομα_νοσοκομείου, μισθός)

Παράρτημα (όνομα_νοσοκομείου, πόλη)

Δημοσ.

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πως πχ το ονομα_ιατρου που υπάρχει παντού κλπ

 

Υ.Γ Στο ΜΠΕΣ σπουδάζεις? Είχαμε ακριβώς ίδια άσκηση παλιά.

Δημοσ.

σχετικά με την πιο πάνω ασκηση, δυο άλλα υποερωτήματα μου τα θεώρησε ο καθηγητής λάθος:

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.όνομα_προϊσταμένου))

 

 

Μπορεί κάποιος να μου δώσει κάτι διαφορετικό?

Δημοσ.

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.όνομα_ιατρού

Δημοσ.
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?

Δημοσ.

Για το πρώτο:

 

>SELECT εργαζεται.ονομα_νοσοκομείου, count(*) 
FROM διαμενει, εργαζεται 
WHERE διαμενει.ονομα_ιατρού = εργαζεται.ονομα_ιατρου 
GROUP BY εργάζεται.ονομα_νοσοκομειου 
HAVING count(*) >=all (SELECT count(*) FROM διαμένει, εργαζεται WHERE διαμένει.ονομα_ιατρου=εργαζεται.ονομα_ιατρου GROUP BY εργαζεται.ονομα_νοσοκομείου)
ORDER BY 2,1 DESC

 

Έτσι θα εμφανιστούν ολα τα νοσοκομεία με τους περισσοτερους ιατρούς (αν είναι πάνω απο 1 και ο αριθμος των γιατρών ισοψηφεί).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...