katina Δημοσ. 2 Απριλίου 2012 Δημοσ. 2 Απριλίου 2012 Καλησπέρα σας, Θα ήθελα να ρωτήσω κάτι πραγματικά advanced. Χρησιμοποιώ αυτό το query: (Select (Case When (select (candidate.observation))>(select AVG(candidate1.observation) from candidate as candidate1 where candidate1.jobid=candidate.jobid ) then 5 END)) όπου ελέγχω ένα πεδίο με το μέσο όρο και αν είναι μεγαλύτερο τυπώνω τον αριθμό 5. Θα ήθελα να το κάνω όμως ως εξής. Αν είναι μεγαλύτερο από το μέσο όρο αυτών που είναι πάνω από το γενικό μέσο όρο να πάρει 4. Αν είναι μικρότερο από το μέσο όρο αυτών που είναι πάνω από το γενικό μέσο όρο να πάρει 5. Αν πάρει το ίδιο με το μέσο όρο να πάρει 3. Αν είναι μεγαλύτερο από το μέσο όρο αυτών που είναι κάτω από το γενικό μέσο όρο να πάρει 2 και ομοίως αν είναι κάτω από το μέσο όρο αυτών που είναι κάτω από το γενικό μέσο όρο να πάρει 1. Τι λέτε γίνεται; Eυχαριστώ πολύ.
Moderators Praetorian Δημοσ. 2 Απριλίου 2012 Moderators Δημοσ. 2 Απριλίου 2012 Κάπως μπερδεμένο μου ακούγεται. Θέλεις να το κάνεις με ένα ερώτημα; Πρόχειρα σκέφτομαι αυτό (χρησιμοποιώντας μια μεταβλητή για να είναι πιο ξεκάθαρο. Με 3 μεταβλητές θα ήταν ακόμα πιο ξεκάθαρο): > -- Gia na pareis to geniko meso oro select @tmpVal := AVG(`candidate`.`observation`) FROM `candidate`; Select candidate.observation, @tmpVal AS genikosMO, (Case When (candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > @tmpVal)) then 4 When (candidate.observation <= (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > @tmpVal)) then 5 END) AS FinalGrade FROM `candidate`; Θα χρειαστεί να συμπληρώσεις τις υπόλοιπες περιπτώσεις
kagelos Δημοσ. 2 Απριλίου 2012 Δημοσ. 2 Απριλίου 2012 Αυτό κάνει; Για SQL Server μιλάμε; > declare @avg float declare @avgAbove float declare @avgBelow float set @avg = (select AVG(Observation) from Candidate) set @avgAbove = (select AVG(Observation) from Candidate where Observation > @avg) set @avgBelow = (select AVG(Observation) from Candidate where Observation < @avg) select Observation, case when Observation > @avgAbove then 5 when Observation <= @avgAbove and Observation > @avg then 4 when Observation = @avg then 3 when Observation > @avgBelow then 2 else 1 end from candidate where candidateid = 10
katina Δημοσ. 3 Απριλίου 2012 Μέλος Δημοσ. 3 Απριλίου 2012 Κάπως μπερδεμένο μου ακούγεται. Θέλεις να το κάνεις με ένα ερώτημα; Πρόχειρα σκέφτομαι αυτό (χρησιμοποιώντας μια μεταβλητή για να είναι πιο ξεκάθαρο. Με 3 μεταβλητές θα ήταν ακόμα πιο ξεκάθαρο): > -- Gia na pareis to geniko meso oro select @tmpVal := AVG(`candidate`.`observation`) FROM `candidate`; Select candidate.observation, @tmpVal AS genikosMO, (Case When (candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > @tmpVal)) then 4 When (candidate.observation <= (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > @tmpVal)) then 5 END) AS FinalGrade FROM `candidate`; Θα χρειαστεί να συμπληρώσεις τις υπόλοιπες περιπτώσεις Χμμμ...αυτό δυστυχώς μου βγάζει syntax error. Χωρίς μεταβλητή δε γίνεται; Σε MySQL προσπαθώ να το κάνω.
nspyrou Δημοσ. 3 Απριλίου 2012 Δημοσ. 3 Απριλίου 2012 Χμμμ...αυτό δυστυχώς μου βγάζει syntax error. Χωρίς μεταβλητή δε γίνεται; Σε MySQL προσπαθώ να το κάνω. Αντικάτέστησε την μεταβλητή στο Query σου, με τα περιεχόμενα της μεταβλητής, για να την πετάξεις έξω από το Query (που σου παρέθεσε ο φίλος, kagelos) τότε: > -- Gia na pareis to geniko meso oro -- select @tmpVal := AVG(`candidate`.`observation`) FROM `candidate`; Select candidate.observation, @tmpVal AS genikosMO, (Case When (candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation >(select AVG(`candidate`.`observation`) FROM `candidate`))) then 4 When (candidate.observation <= (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate`))) then 5 END) AS FinalGrade FROM `candidate`; Δεν έχω εγκατάσταση MySQL για να ελέγξω το αποτέλεσμα, αλλά νομίζω οτι πρέπει να είναι εντάξει. Δες το κι εσύ φυσικά.
Moderators Praetorian Δημοσ. 3 Απριλίου 2012 Moderators Δημοσ. 3 Απριλίου 2012 Χμμμ...αυτό δυστυχώς μου βγάζει syntax error. Χωρίς μεταβλητή δε γίνεται; Σε MySQL προσπαθώ να το κάνω. O κώδικας που έδωσα σε μένα λειτουργεί χωρίς πρόβλημα για MySQL Server (5.5.21) σε Windows. Ίσως υπάρχει κάποιο θέμα με case-sensitive ονόματα σε Linux(?). Χωρίς μεταβλητή γίνεται (όπως δείχνει παραπάνω ο nspyrou) και με 3 μεταβλητές είναι όπως το δείχνει ο kagelos. Επίσης, η λογική των cases νομίζω ότι είναι σωστότερη όπως τη δείχνει ο kagelos, παρά όπως είναι στην εκφώνηση.
katina Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 Αντικάτέστησε την μεταβλητή στο Query σου, με τα περιεχόμενα της μεταβλητής, για να την πετάξεις έξω από το Query (που σου παρέθεσε ο φίλος, kagelos) τότε: > Select candidate.observation, @tmpVal AS genikosMO, (Case When (candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation >(select AVG(`candidate`.`observation`) FROM `candidate`))) then 4 When (candidate.observation <= (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate`))) then 5 END) AS FinalGrade FROM `candidate`; Δεν έχω εγκατάσταση MySQL για να ελέγξω το αποτέλεσμα, αλλά νομίζω οτι πρέπει να είναι εντάξει. Δες το κι εσύ φυσικά. Ευχαριστώ πολύ!!! Δουλεύει όντως συντακτικά...Τώρα θα ρωτήσω κάτι χαζό γιατί έχω κολλήσει. Οι περιπτώσεις που θέλω είναι οι εξής: α) candidate.observation > M.O tων observations που είναι πάνω από το Γενικό Μέσο Όρο παίρνει 5 β) candidate.observation < M.O tων observations που είναι πάνω από το Γενικό Μέσο Όρο παίρνει 4 γ) candidate.observation = Γ.Μ.Ο. παίρνει 3 δ) candidate.observation > M.O tων observations που είναι κάτω από το Γενικό Μέσο Όρο παίρνει 2 ε) candidate.observation < M.O tων observations που είναι κάτω από το Γενικό Μέσο Όρο παίρνει 1 Μπορείτε να με βοηθήσετε και σε αυτό για να το διαμορφώσω αντίστοιχα; Σας ευχαριστώ πολύ!!
Moderators Praetorian Δημοσ. 4 Απριλίου 2012 Moderators Δημοσ. 4 Απριλίου 2012 Ήδη σου έχει δώσει o kagelos όλα τα cases. Που έχεις κολλήσει;
katina Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 Προσπάθησα να το μετατρέψω χωρίς μεταβλητές αυτό που μου είπε ο kagelos αλλά κάτι μάλλον δεν έκανα σωστά! >(select candidate.observation, case when candidate.observation > (select AVG(candidate.observation) from candidate where candidate.observation > (select AVG(candidate.observation) from candidate)) then 5 when candidate.observation <= (select AVG(candidate.observation) from candidate where candidate.observation > (select AVG(candidate.observation) from candidate)) and candidate.observation > (select AVG(candidate.observation) from candidate) then 4 when candidate.observation = (select AVG(candidate.observation) from candidate) then 3 when candidate.observation > (select AVG(candidate.observation) from candidate where candidate.observation < (select AVG(candidate.observation) from candidate)) then 2 else 1 end) AS FinalGrade;
Moderators Praetorian Δημοσ. 4 Απριλίου 2012 Moderators Δημοσ. 4 Απριλίου 2012 Δοκίμασε αυτό. Άλλαξα θέση σε κάποιες παρενθέσεις, και πρόσθεσα ένα from που σου έλειπε. >select candidate.observation, (case when candidate.observation > (select AVG(candidate.observation) from candidate where candidate.observation > (select AVG(candidate.observation) from candidate)) then 5 when (candidate.observation <= (select AVG(candidate.observation) from candidate where candidate.observation > (select AVG(candidate.observation) from candidate)) and (candidate.observation > (select AVG(candidate.observation) from candidate))) then 4 when candidate.observation = (select AVG(candidate.observation) from candidate) then 3 when candidate.observation > (select AVG(candidate.observation) from candidate where candidate.observation < (select AVG(candidate.observation) from candidate)) then 2 else 1 end) AS FinalGrade FROM candidate;
katina Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 Μου βγάζει συντακτικό error για κάποιο περιέργο λόγο
Moderators Praetorian Δημοσ. 4 Απριλίου 2012 Moderators Δημοσ. 4 Απριλίου 2012 Και τί λέει αυτό το συντακτικό error;
katina Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 cannot retrieve columns information.... αλλά τα columns είναι σωστά ορισμένα!
katina Δημοσ. 4 Απριλίου 2012 Μέλος Δημοσ. 4 Απριλίου 2012 Σας ευχαριστώ πολύ. Τελικά ο παρακάτω κώδικας φάνηκε να δουλεύει...ωστόσο για να το κάνω λίγο πιο advanced ... όλοι οι candidates έχουν ένα jobid, θα ήθελα ο μέσος όρος να είναι ανά jobid και όχι να λαμβάνεται υπόχη από όλους τους candidates...Τι λέτε; >(select Case When (candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate` WHERE candidate.observation > (select AVG(`candidate`.`observation`) FROM `candidate`))) then 5 when (candidate.observation <= (select AVG(candidate.observation) from candidate where candidate.observation > (select AVG(candidate.observation) from candidate)) and (candidate.observation > (select AVG(candidate.observation) from candidate))) then 4 when candidate.observation = (select AVG(candidate.observation) from candidate) then 3 when candidate.observation > (select AVG(candidate.observation) from candidate where candidate.observation < (select AVG(candidate.observation) from candidate)) then 2 else 1 END) AS FinalGrade2 FROM `candidate`
kagelos Δημοσ. 4 Απριλίου 2012 Δημοσ. 4 Απριλίου 2012 Να ρωτήσω εγώ κάτι, ο λόγος που δεν χρησιμοποιείς μεταβλητές ή έστω CTE (δεν ξέρω αν έχει η MySQL) ποιος είναι; Για να μην καταλαβαίνει κανείς τι γράφεις;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα