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

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

Δημοσ.

Μονο σε εμένα φαινεται λαθος η δομή; Εννοώ αν εχουμε πχ 7 ασκήσεις αλλα κανένας φοιτητής δεν έκανε την 7η, πως θα φανεί οτι είναι 7 για να υπολογιστεί ο μέσος όρος;

 

Μήπως έτσι ειναι καλύτερα;

 

candi(id,name,vathmos_exetasewn)

askiseis(id,etos)

vathmoi(id,askisi_id, candidate_id, vathmos) 

  • Like 1
Δημοσ.

 

SELECT D.etos , D.candidate_id, sum(D.Vathmos)/CAST(F.AskhseisNo AS Decimal(3,2)) as MesosVathmosEtous
from Askiseis D
LEFT OUTER JOIN
(SELECT MAX(Y.ICount) AS AskhseisNo, Y.Etos
FROM (SELECT DISTINCT Askiseis.Etos, Count(Askiseis.candidate_id) as ICount from Askiseis  Group By candidate_id,Etos) y
GROUP BY y.ETOS) F ON F.Etos = D.Etos
Group By  D.etos, D.candidate_id, D.etos,  F.AskhseisNo
 

 

Έκατσα πέντε λεπτά στο lunchbreak και το παραπάνω επιστρέφει λίστα με το μέσο όρο βαθμολογίας όλων όσων έδωσαν εξετάσεις σε κάποιο έτος. (όσον κατέθεσαν κάτι). 

 

Έχεις να γράψεις τον υπόλοιπο κώδικα να σου επιστρέφει τον μεγαλύτερο βαθμό, και τι θες να κάνεις με όσους δεν κατέθεσαν βαθμό για ένα έτος. Σε MS SQL δουλεύει. 



Μονο σε εμένα φαινεται λαθος η δομή; Εννοώ αν εχουμε πχ 7 ασκήσεις αλλα κανένας φοιτητής δεν έκανε την 7η, πως θα φανεί οτι είναι 7 για να υπολογιστεί ο μέσος όρος;

 

Μήπως έτσι ειναι καλύτερα;

 

candi(id,name,vathmos_exetasewn)

askiseis(id,etos)

vathmoi(id,askisi_id, candidate_id, vathmos) 

 

 

Ναι αλλά ο/η ΟΡ γκρίνιαξε μόλις έκανα υπόδειξη ότι χρειάζεται άλλη δομή πινάκων για να γίνει αυτό. 

Δημοσ.

@Apoll

Νομίζω Οχι Count(Askiseis.candidate_id) αλλά το σκέτο id που είναι το id των ασκήσεων.

Επίσης έχω καιρό να γράψω σε mssql αλλά το SELECT DISTINCT Askiseis.Etos, Count(...)

δεν νομίζω να είναι το ίδιο με  SELECT Askiseis.Etos, Count(DISTINCT...)

 

Το 2ο ζητάει αν κατάλαβα καλά. Οπότε  νομίζω ότι είναι λάθος

Δημοσ.

Δεν είναι λάθος, μιας και τα αποτελέσματα είναι ακριβή. 

 

To DISTINCT υπάρχει λόγο του όταν άρχισα να την γράφω το query ξεκίνησα από αυτό το σημείο και το έριχνα σε temp πίνακα. Μειώνει επίσης τα δεδομένα που θα ψάξει αργότερα επιταχύνοντας το μιας και επιστρέφει μόνο ένα ζευγάρι Έτος-Ασκήσεις. (Αυτό θα το είχα σε temp table μιας και θα επιταχύνει την διαδικασία εκθετικά, αφού θα εκτελούσε το Select μόνο μία φορά)

 

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

 

Για το Count, απλά επέλεγα μία column, θα ήταν το ίδιο αν επέλεγα ID ή Etos ή Vathmo ή κάτι άλλο από αυτό το πίνακα. 

Δημοσ. (επεξεργασμένο)

Κάνεις πολύ μεγάλο λάθος, τα αποτελέσματα ΤΥΧΑΙΝΕΙ να είναι ακριβή για κάποιο παράδειγμα που δοκίμασες και δεν έχει να κάνει με Ms ή STANDARD SQL ή με οποιαδήποτε γλώσσα

 

Αν ας πουμε δεν υπάρχει κάνενας μαθητης που ένα συγκεκριμένο έτος έχει βαθμολογηθεί για όλες τις ασκήσεις ο παρονομαστής σου δεν είναι ο αριθμός των ασκήσεων του έτους αλλά ο max αριθμός ασκήσεων που έχει κάποιος μαθητής το έτος. Αν σε ένα έτος υπήρχαν 5 διαφορετικές ασκήσεις για τις 2 βαθμολογήθηκε ένας μαθητής, για τις άλλες 3 ένας άλλος, το select που παρουσιασες διαιρεί το αθροισμα των βαθμών του καθε μαθητή με το 3 ενώ θα έπρεπε να το διαιρέσεις με το 5. Οπότε ποια στήλη θα είναι μέσα στο count και αν το distinct θα είναι στο count είναι πολύ μεγάλη διαφορά

Επεξ/σία από TAKE5
Δημοσ.

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

Δημοσ.

Κάνεις πολύ μεγάλο λάθος, τα αποτελέσματα ΤΥΧΑΙΝΕΙ να είναι ακριβή για κάποιο παράδειγμα που δοκίμασες και δεν έχει να κάνει με Ms ή STANDARD SQL ή με οποιαδήποτε γλώσσα

 

Αν ας πουμε δεν υπάρχει κάνενας μαθητης που ένα συγκεκριμένο έτος έχει βαθμολογηθεί για όλες τις ασκήσεις ο παρονομαστής σου δεν είναι ο αριθμός των ασκήσεων του έτους αλλά ο max αριθμός ασκήσεων που έχει κάποιος μαθητής το έτος. Αν σε ένα έτος υπήρχαν 5 διαφορετικές ασκήσεις για τις 2 βαθμολογήθηκε ένας μαθητής, για τις άλλες 3 ένας άλλος, το select που παρουσιασες διαιρεί το αθροισμα των βαθμών του καθε μαθητή με το 3 ενώ θα έπρεπε να το διαιρέσεις με το 5. Οπότε ποια στήλη θα είναι μέσα στο count και αν το distinct θα είναι στο count είναι πολύ μεγάλη διαφορά

 

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

 

 

candi(id,name,vathmos_exetasewn)

askiseis(id,candidate_id,vathmos,etos)

 

Δεν ξέρω καν αν το Askiseis.ID είναι identity ή όχι και αντιπροσωπεύει τον αριθμό της άσκησης (οπότε θα έχεις πολλά 1, 2, 3 και δουλεύεις διαφορετικά). Ρώτησα και δεν πήρα απάντηση. 

 

Δεν είμαι Μάντης για να ξέρω την ακριβή δομή, και κόψε το ύφος.

Δημοσ.

Μαντης δεν είναι κανένας, όλο το υπόλοιπο select σου βασίζεται στο ότι το id είναι ο αριθμός της άσκησης και είναι επαναλαμβανόμενο. Οπως σου έγραψα άν απλώς γράψεις etos,count(distinct id) έχεις τον αριθμό των ασκήσεων ανά έτος εφόσον ισχύει το

 

Υποθέτουμε ότι κάθε άσκηση την έχει λύσει τουλάχιστον 1 φοιτητής,

 

 

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

 

To προβλημα πάντως ήταν ενδιαφέρων θυμήθηκα και Sql

Δημοσ.

Δεν είμαι master :) στην SQL για να ξέρω με σιγουριά αλλά διαβάζω τόσες συστάσεις. Καμμία δεν είναι σωστή ? Μέχρι και έτοιμο κώδικα έδωσε ο Apoll. Πόσο παραπάνω να βοηθήσει κάποιος ?

Δημοσ.

Είναι σε Mssql, αλλά χρειάζομαι το max σε mysql...έχω κολλήσει ρε γμτ...

 

H τελευταία μου προσπάθεια:

 

(Select (sum(a1.vathmos)/(Select 5*Max(cnt) from (Select count(distinct a2.askisi_id) cnt from askiseis as a2 group by a2.etos) as w3)) cnt from askiseis as a2 where a2.user_id=cardi.AEM group by a2.user_id and a2.etos) as ΟΚ

 

ωστόσο διαιρεί το άθροισμα όλων των βαθμών του μαθητή με το μέγιστο πλήθος των μαθημάτων από όλα τα έτη, ενώ εγώ χρειάζομαι το μέγιστο (άθροισμα/πλήθος ασκήσεων ανά έτος)
 

Δημοσ.

Μετά από πολύ σκέψη νομίζω το βρήκα...

 

(Select sum(a2.vathmos)/nullif((5*(Select count(distinct a8.askisi_id) from askiseis as a8 where a8.etos=a2.etos)), 2) from askiseis as a2 where a2.user_id=cardi.AEM group by a2.etos order by sum(a2.vathmos)/(5*(Select count(distinct a8.askisi_id) from askiseis as a8 where a8.etos=a2.etos))  desc limit 1) as vath_ask
 

 

 

Δημοσ.

Για κάτσε ρε συ. Που βρήκες το askiseis.askisi_id?

Αυτό δεν το είχες δώσει την προηγούμενη σελίδα που ζήτησα την δομή των πινάκων. 

 

Μισά δεδομένα δίνεις, και περιμένεις σωστές απαντήσεις;

 

 

Επίσης γιατί πολλαπλασιάζεις επί 5, και αν το αποτέλεσμα σου έρθει 2 το κάνεις NULL; Διαίρεση με NULL είναι λάθος στα μαθηματικά. 

Δημοσ.

Υπήρχε το id των ασκήσεων. Επίσης, το έβαλα αν είναι null να γίνεται 2, ώστε να διαιρείται με το 0.

 

Τέλος, τελικά το πολλαπλασιάζω με 5 γιατί το θέλω με άριστα το 2, όχι με άριστα το 10.



Apoll σε ευχαριστώ πολύ πάντως για τη βοήθεια και τους υπόλοιπους για τις συμβουλές.

Δημοσ.

Υπήρχε το id των ασκήσεων. Επίσης, το έβαλα αν είναι null να γίνεται 2, ώστε να διαιρείται με το 0.

 

Τέλος, τελικά το πολλαπλασιάζω με 5 γιατί το θέλω με άριστα το 2, όχι με άριστα το 10.

 

Apoll σε ευχαριστώ πολύ πάντως για τη βοήθεια και τους υπόλοιπους για τις συμβουλές.

 

Nullif επιστρέφει NULL όταν η τιμή είναι 2, όπως το έχεις γράψει. ISNULL είναι αυτό που χρειάζεσαι. 

 

Το ID τον ασκήσεων, όπως το έδωσες στην δομή των πινάκων, είναι askiseis.ID και όχι askiseis.askisi_id. 

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

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

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

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

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

Σύνδεση

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

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