katina Δημοσ. 23 Μαΐου 2013 Δημοσ. 23 Μαΐου 2013 Καλησπέρα σας, έχω 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? Ευχαριστώ εκ των προτέρων...
Apoll Δημοσ. 23 Μαΐου 2013 Δημοσ. 23 Μαΐου 2013 Αν αναφερόμαστε σε MS SQL τo query έχει αρκετά συντακτικά λάθη για αρχή. Επίσης έχει δύο λογικά λάθη. Ρίξε την δομή των πινάκων επακριβώς, και το αποτέλεσμα που θες να πάρεις. Δεν είναι δύκολο να πω την αλήθεια. Όχι πάνω από 5 λεπτά αν ξέραμε την δομή των πινάκων και το απαιτούμενο αποτέλεσμα.
katina Δημοσ. 23 Μαΐου 2013 Μέλος Δημοσ. 23 Μαΐου 2013 Είναι mysql. Η δομή των πινάκων έχει ως εξής: candi(id,name,vathmos_exetasewn) askiseis(id,candidate_id,vathmos,etos) Τονίζω ότι αν ένας μαθητής το έτος 2012-2013 παρέδωσε 3 ασκήσεις και πήρε σε όλες 10, αλλά συνολικά ζητήθηκαν 13, θα πρέπει να υπολογιστεί ως το άθροισμα του/ πλήθος ασκήσεων (πχ. διαφορετικών id ασκήσεων) που ζητήθηκαν. Άρα ενώ θα έχει έχει 3 εγγραφές στη βάση θα υπολογιστεί ως sum των 3 βαθμών/ 13. Στο τέλος ο βαθμός των ασκήσεων υπολογίζεται ως ο μέγιστος μέσος όρος από τις χρονιές που παρέδωσε ασκήσεις.
Timonkaipumpa Δημοσ. 23 Μαΐου 2013 Δημοσ. 23 Μαΐου 2013 Γκρουπάρεις ανά student id τις ασκήσεις και μετά ανά έτος και από εκεί βλέπεις πόσες έχεις. Για το ίδιο έτος αθροίζεις τους βαθμούς και τους διαιρείς με το πλήθος των ασκήσεων ανά student id και ανά έτος. Βέβαια.. με ψιλοχάλασε η τακτική "για SQL masters"... μπας και τσιμπήσεις καμία βοήθεια για την εργασία που πρέπει να παραδώσεις τώρα που έρχονται τα deadlines στις σχολές. 1
Apoll Δημοσ. 23 Μαΐου 2013 Δημοσ. 23 Μαΐου 2013 Είναι mysql. Η δομή των πινάκων έχει ως εξής: candi(id,name,vathmos_exetasewn) askiseis(id,candidate_id,vathmos,etos) Τονίζω ότι αν ένας μαθητής το έτος 2012-2013 παρέδωσε 3 ασκήσεις και πήρε σε όλες 10, αλλά συνολικά ζητήθηκαν 13, θα πρέπει να υπολογιστεί ως το άθροισμα του/ πλήθος ασκήσεων (πχ. διαφορετικών id ασκήσεων) που ζητήθηκαν. Άρα ενώ θα έχει έχει 3 εγγραφές στη βάση θα υπολογιστεί ως sum των 3 βαθμών/ 13. Στο τέλος ο βαθμός των ασκήσεων υπολογίζεται ως ο μέγιστος μέσος όρος από τις χρονιές που παρέδωσε ασκήσεις. Δεν λες που είναι οι τιμές για το πόσες ασκήσεις ζητήθηκαν ανά έτος, ανά μαθητή που χρειάζεσαι για να διαιρέσεις. Εκτός αν στο πίνακα ασκήσεις έχεις άσκηση Χ με 0 βαθμό για κάποια που δεν παρέδωσε Και θα συμφωνήσω με τον Timon παραπάνω.
katina Δημοσ. 24 Μαΐου 2013 Μέλος Δημοσ. 24 Μαΐου 2013 Δεν είναι εργασία...! Είναι κανονική εφαρμογή...άλλωστε έχουν περάσει κατά πολύ τα χρόνια για σπουδές! Τη λογική την ξέρω... Σας είπα πως οι εγγραφές του πίνακα ασκήσεις είναι μόνο για αυτές που παρέδωσαν οι φοιτητές, άρα πρώτα πρέπει να υπολογιστεί το άθροισμα των βαθμών τους και μετά να διαιρεθεί με το max count των ασκήσεων groupαρισμένα ανά μαθητή, όπως το έχω παραπάνω στο query. Το πρόβλημα είναι όταν θέλω να εξάγω το max μέσο όρο ανά έτος. Το χρειάζομαι σε ένα query.
Apoll Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Άμα στον πίνακα ασκήσεις είναι μόνο αυτές που έχει δώσει, πως ξέρουμε πόσες είναι συνολικά αυτές που έπρεπε να δώσει για κάθε χρονιά, για να κάνουμε την διαίρεση; π.χ. Όπως το περιγράφεις, το count στον πίνακα ασκήσεις μπορεί να επιστρέψε 3. Αλλά να του ζητήθηκαν 13. Από που προέρχεται το 13;
katina Δημοσ. 24 Μαΐου 2013 Μέλος Δημοσ. 24 Μαΐου 2013 Υποθέτουμε ότι κάθε άσκηση την έχει λύσει τουλάχιστον 1 φοιτητής, άρα υπολογίζουμε το count της id της άσκησης ανά χρονιά.
Apoll Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Συμβουλή! Με υποθέσεις δεν μπορείς να πάρεις σωστά αποτελέσματα ποτέ, ούτε να γράψεις robust εφαρμογή. Αν τους ζητήθηκαν 14 ασκήσεις, και όλοι άφησαν εκτός την 14η, ενώ υπάρχουν 13 ασκήσεις που έχουν συμπληρωθεί από διάφορους, το αποτέλεσμα θα είναι πάντα λάθος. Επίσης το πρόβλημά σου δεν λύνεται με ένα "απλό query" μιας γραμμής. Χρειάζεται να γίνει με stored procedure. Μιας και η δομή των πινάκων περιπλέκει τα πράγματα, όπου πιθανή επέκταση και debugging θα είναι ίδιο με το να δεις από που φυσά ο αέρας σε μέρα που έχει άπνοια.
katina Δημοσ. 24 Μαΐου 2013 Μέλος Δημοσ. 24 Μαΐου 2013 Δε συμφωνώ, αλλά σε ευχαριστώ. Αν μία άσκηση δεν την απαντήσει κανένας φοιτητής δε θα ληφθεί υπόψη. Δε χρειάζομαι συμβουλές για την εφαρμογή, αλλά βοήθεια στο query.
TAKE5 Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Υπάρχει περιπτωση μια ασκηση να την δώσει 2 χρονιές ο ίδιος μαθητής και να έχει καλύτερο βαθμό την πρώτη χρονιά?
Apoll Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Δε συμφωνώ, αλλά σε ευχαριστώ. Αν μία άσκηση δεν την απαντήσει κανένας φοιτητής δε θα ληφθεί υπόψη. Δε χρειάζομαι συμβουλές για την εφαρμογή, αλλά βοήθεια στο query. Το ID στον πίνακα ασκήσεις δεν είναι identity;
Timonkaipumpa Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 Δεν είναι εργασία...! Είναι κανονική εφαρμογή...άλλωστε έχουν περάσει κατά πολύ τα χρόνια για σπουδές! Τη λογική την ξέρω... Σας είπα πως οι εγγραφές του πίνακα ασκήσεις είναι μόνο για αυτές που παρέδωσαν οι φοιτητές, άρα πρώτα πρέπει να υπολογιστεί το άθροισμα των βαθμών τους και μετά να διαιρεθεί με το max count των ασκήσεων groupαρισμένα ανά μαθητή, όπως το έχω παραπάνω στο query. Το πρόβλημα είναι όταν θέλω να εξάγω το max μέσο όρο ανά έτος. Το χρειάζομαι σε ένα query. Εφόσον δεν είναι για εργασία σχολής, συμπάθα με για το σχόλιο παραπάνω. Ανά φοιτητή μπορείς να το βγάλεις. Η λογική είναι αυτή που σου είπα παραπάνω και με μία γρήγορη (μα πολύ γρήγορη) σκέψη θαρρώ πως γίνεται και με nested queries αντί για procedures. Ωστόσο, εγώ δεν έχω καταλάβει ακόμα τι ακριβώς πληροφορία έχεις στους πίνακες. Θα μπορούσες να την εξηγήσεις λίγο; Τι αποθηκεύεται και σε ποιο πεδίο.
TAKE5 Δημοσ. 24 Μαΐου 2013 Δημοσ. 24 Μαΐου 2013 ευκολα γινεται με 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 Ελπίζω να βοήθησα
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα