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

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

Δημοσ.

Καλησπέρα σας,

 

έχω 2 πίνακες, έναν με μαθητές και έναν με βαθμούς. Στον πίνακα με τους βαθμούς έχω άσκηση, βαθμός και έτος και θέλω να βγάλω το μέσο όρο ανά έτος, απλά δε μπορώ να χρησιμοποιήσω την avg γιατί μπορεί να έχει στη βάση 3 βαθμούς ασκήσεων που να βαθμολογήθηκαν με 10, αλλά να ζητήθηκαν 7 ασκήσεις, άρα ο βαθμούς του είναι (3*10)/7.

 

Από τους μέσους όρους θέλω τον Max // Δηλαδή αν πέρσι έστειλε ασκήσεις, αλλά φέτος ξαναέστειλε και έχει καλύτερο μέσο όρο, θέλω τον φετινό.

 

Δοκίμασα κάτι τέτοιο

 

(Select Max(vath) from ((Select sum(a2.vathmos) from askiseis as a2 where cardi.AEM=a2.user_id group by etos)/(Select Max(cnt) from (Select count(a4.askisi_id) cnt from askiseis as a4 group by a4.etos and a4.user_id) as q4)) AS vath) as telikos

 

Αλλά δε δουλεύει... έχει κανείς καμιά ιδέα για το query?

 

Ευχαριστώ εκ των προτέρων...
 

 

 

 

Δημοσ.

Αν αναφερόμαστε σε MS SQL τo query έχει αρκετά συντακτικά λάθη για αρχή. Επίσης έχει δύο λογικά λάθη. 

 

Ρίξε την δομή των πινάκων επακριβώς, και το αποτέλεσμα που θες να πάρεις. 

Δεν είναι δύκολο να πω την αλήθεια. Όχι πάνω από 5 λεπτά αν ξέραμε την δομή των πινάκων και το απαιτούμενο αποτέλεσμα. 

Δημοσ.

Είναι mysql.

 

Η δομή των πινάκων έχει ως εξής:

 

candi(id,name,vathmos_exetasewn)

askiseis(id,candidate_id,vathmos,etos)

 

Τονίζω ότι αν ένας μαθητής το έτος 2012-2013 παρέδωσε 3 ασκήσεις και πήρε σε όλες 10, αλλά συνολικά ζητήθηκαν 13, θα πρέπει να υπολογιστεί ως το άθροισμα του/ πλήθος ασκήσεων (πχ. διαφορετικών id ασκήσεων) που ζητήθηκαν. Άρα ενώ θα έχει έχει 3 εγγραφές στη βάση θα υπολογιστεί ως sum των 3 βαθμών/ 13.

 

Στο τέλος ο βαθμός των ασκήσεων υπολογίζεται ως ο μέγιστος μέσος όρος από τις χρονιές που παρέδωσε ασκήσεις.

Δημοσ.

Γκρουπάρεις ανά student id τις ασκήσεις και μετά ανά έτος και από εκεί βλέπεις πόσες έχεις. 

 

Για το ίδιο έτος αθροίζεις τους βαθμούς και τους διαιρείς με το πλήθος των ασκήσεων ανά student id και ανά έτος.

 

 

Βέβαια.. με ψιλοχάλασε η τακτική "για SQL masters"... μπας και τσιμπήσεις καμία βοήθεια για την εργασία που πρέπει να παραδώσεις τώρα που έρχονται τα deadlines στις σχολές. 

  • Like 1
Δημοσ.

Είναι mysql.

 

Η δομή των πινάκων έχει ως εξής:

 

candi(id,name,vathmos_exetasewn)

askiseis(id,candidate_id,vathmos,etos)

 

Τονίζω ότι αν ένας μαθητής το έτος 2012-2013 παρέδωσε 3 ασκήσεις και πήρε σε όλες 10, αλλά συνολικά ζητήθηκαν 13, θα πρέπει να υπολογιστεί ως το άθροισμα του/ πλήθος ασκήσεων (πχ. διαφορετικών id ασκήσεων) που ζητήθηκαν. Άρα ενώ θα έχει έχει 3 εγγραφές στη βάση θα υπολογιστεί ως sum των 3 βαθμών/ 13.

 

Στο τέλος ο βαθμός των ασκήσεων υπολογίζεται ως ο μέγιστος μέσος όρος από τις χρονιές που παρέδωσε ασκήσεις.

 

Δεν λες που είναι οι τιμές για το πόσες ασκήσεις ζητήθηκαν ανά έτος, ανά μαθητή που χρειάζεσαι για να διαιρέσεις. 

Εκτός αν στο πίνακα ασκήσεις έχεις άσκηση Χ με 0 βαθμό για κάποια που δεν παρέδωσε

 

 

 

Και θα συμφωνήσω με τον Timon παραπάνω. 

Δημοσ.

Δεν είναι εργασία...! Είναι κανονική εφαρμογή...άλλωστε έχουν περάσει κατά πολύ τα χρόνια για σπουδές! Τη λογική την ξέρω...

 

Σας είπα πως οι εγγραφές του πίνακα ασκήσεις είναι μόνο για αυτές που παρέδωσαν οι φοιτητές, άρα πρώτα πρέπει να υπολογιστεί το άθροισμα των βαθμών τους και μετά να διαιρεθεί με το max count των ασκήσεων groupαρισμένα ανά μαθητή, όπως το έχω παραπάνω στο query. Το πρόβλημα είναι όταν θέλω να εξάγω το max μέσο όρο ανά έτος.

 

Το χρειάζομαι σε ένα query.

Δημοσ.

Άμα στον πίνακα ασκήσεις είναι μόνο αυτές που έχει δώσει, πως ξέρουμε πόσες είναι συνολικά αυτές που έπρεπε να δώσει για κάθε χρονιά, για να κάνουμε την διαίρεση; 

 

π.χ.

Όπως το περιγράφεις, το count στον πίνακα ασκήσεις μπορεί να επιστρέψε 3. Αλλά να του ζητήθηκαν 13.

Από που προέρχεται το 13;

Δημοσ.

Υποθέτουμε ότι κάθε άσκηση την έχει λύσει τουλάχιστον 1 φοιτητής, άρα υπολογίζουμε το count της id της άσκησης ανά χρονιά.

Δημοσ.

Συμβουλή! Με υποθέσεις δεν μπορείς να πάρεις σωστά αποτελέσματα ποτέ, ούτε να γράψεις robust εφαρμογή. 

 

Αν τους ζητήθηκαν 14 ασκήσεις, και όλοι άφησαν εκτός την 14η, ενώ υπάρχουν 13 ασκήσεις που έχουν συμπληρωθεί από διάφορους, το αποτέλεσμα θα είναι πάντα λάθος. 

 

 

Επίσης το πρόβλημά σου δεν λύνεται με ένα "απλό query" μιας γραμμής.  Χρειάζεται να γίνει με stored procedure. 

Μιας και η δομή των πινάκων περιπλέκει τα πράγματα, όπου πιθανή επέκταση και debugging θα είναι ίδιο με το να δεις από που φυσά ο αέρας σε μέρα που έχει άπνοια. 

Δημοσ.

Δε συμφωνώ, αλλά σε ευχαριστώ. Αν μία άσκηση δεν την απαντήσει κανένας φοιτητής δε θα ληφθεί υπόψη. Δε χρειάζομαι συμβουλές για την εφαρμογή, αλλά βοήθεια στο query.

Δημοσ.

Υπάρχει περιπτωση μια ασκηση να την δώσει 2 χρονιές ο ίδιος μαθητής και να έχει καλύτερο βαθμό την πρώτη χρονιά?

Δημοσ.

Δε συμφωνώ, αλλά σε ευχαριστώ. Αν μία άσκηση δεν την απαντήσει κανένας φοιτητής δε θα ληφθεί υπόψη. Δε χρειάζομαι συμβουλές για την εφαρμογή, αλλά βοήθεια στο query.

 

Το ID στον πίνακα ασκήσεις δεν είναι identity; 

Δημοσ.

Δεν είναι εργασία...! Είναι κανονική εφαρμογή...άλλωστε έχουν περάσει κατά πολύ τα χρόνια για σπουδές! Τη λογική την ξέρω...

 

Σας είπα πως οι εγγραφές του πίνακα ασκήσεις είναι μόνο για αυτές που παρέδωσαν οι φοιτητές, άρα πρώτα πρέπει να υπολογιστεί το άθροισμα των βαθμών τους και μετά να διαιρεθεί με το max count των ασκήσεων groupαρισμένα ανά μαθητή, όπως το έχω παραπάνω στο query. Το πρόβλημα είναι όταν θέλω να εξάγω το max μέσο όρο ανά έτος.

 

Το χρειάζομαι σε ένα query.

 

Εφόσον δεν είναι για εργασία σχολής, συμπάθα με για το σχόλιο παραπάνω. 

 

Ανά φοιτητή μπορείς να το βγάλεις. Η λογική είναι αυτή που σου είπα παραπάνω και με μία γρήγορη (μα πολύ γρήγορη) σκέψη θαρρώ πως γίνεται και με nested queries αντί για procedures. 

 

Ωστόσο, εγώ δεν έχω καταλάβει ακόμα τι ακριβώς πληροφορία έχεις στους πίνακες. Θα μπορούσες να την εξηγήσεις λίγο; Τι αποθηκεύεται και σε ποιο πεδίο. 

 

Δημοσ.

ευκολα γινεται με 1 select δεν νομίζω ότι είναι προβλημα. Εχω χρόνια να γράψω mysql αλλά προσπάθησε να σκεφτείς λογικά και να βρεις ενα-ενα τα ζητούμενα. Θα αποφύγω να σου γράψω το sql ώστε να το κάνεις μόνη(?) σου

Ας πουμε για να μπορεσεις να βγάλεις μέσο όρο χρειάζεσαι αριθμό ασκήσεων αυτό που γράφεις

Select count(a4.askisi_id) cnt from askiseis as a4 group by a4.etos and a4.user_id

είναι ανα έτος και μαθητή (αν καταλαβαίνω καλά από τι δομή που έδωσες user_id δεν υπάρχει μόνο candi_id). Αρα το σωστό θα ήταν count distinct και  group by μόνο ανα ετος και βέβαια δεν έχεις καταλάβει τη λογική του select from (select....) γιατί δεν χρειάζεσαι μόνο τον αριθμό των μαθημάτων αλλά και το έτος σε αυτό το select ωστε να κάνεις το join με το εξωτερικό select

 

To αμέσως επόμενο βήμα εκτος από το select που μόλις αναφέρθηκε θα είναι πάλι από τον πίνακα των ασκήσεων ανα candi_id και ετος , αθροισμα βαθμών / αριθμό μαθημάτω από το παραπάνω select και join με τα έτη

 

Τέλος το εξωτερικό select θα είναι από τον πίνακα των μαθητών ας πουμε id, name και max του μέσου όρου που σου δίνει το αμέσως προηγούμενο select με join φυσικά το candi_id

 

Ελπίζω να βοήθησα

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...