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

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

Δημοσ.

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

 

Θα ήθελα να ρωτήσω κάτι πραγματικά 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
Δημοσ.

Κάπως μπερδεμένο μου ακούγεται. Θέλεις να το κάνεις με ένα ερώτημα;

Πρόχειρα σκέφτομαι αυτό (χρησιμοποιώντας μια μεταβλητή για να είναι πιο ξεκάθαρο. Με 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`;

 

Θα χρειαστεί να συμπληρώσεις τις υπόλοιπες περιπτώσεις

Δημοσ.

Αυτό κάνει; Για 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

Δημοσ.

Κάπως μπερδεμένο μου ακούγεται. Θέλεις να το κάνεις με ένα ερώτημα;

Πρόχειρα σκέφτομαι αυτό (χρησιμοποιώντας μια μεταβλητή για να είναι πιο ξεκάθαρο. Με 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 προσπαθώ να το κάνω.

Δημοσ.

Χμμμ...αυτό δυστυχώς μου βγάζει 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
Δημοσ.

Χμμμ...αυτό δυστυχώς μου βγάζει syntax error. Χωρίς μεταβλητή δε γίνεται; Σε MySQL προσπαθώ να το κάνω.

 

O κώδικας που έδωσα σε μένα λειτουργεί χωρίς πρόβλημα για MySQL Server (5.5.21) σε Windows. Ίσως υπάρχει κάποιο θέμα με case-sensitive ονόματα σε Linux(?).

 

Χωρίς μεταβλητή γίνεται (όπως δείχνει παραπάνω ο nspyrou) και με 3 μεταβλητές είναι όπως το δείχνει ο kagelos.

Επίσης, η λογική των cases νομίζω ότι είναι σωστότερη όπως τη δείχνει ο kagelos, παρά όπως είναι στην εκφώνηση.

Δημοσ.

Αντικάτέστησε την μεταβλητή στο 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

 

Μπορείτε να με βοηθήσετε και σε αυτό για να το διαμορφώσω αντίστοιχα;

 

Σας ευχαριστώ πολύ!!

Δημοσ.

Προσπάθησα να το μετατρέψω χωρίς μεταβλητές αυτό που μου είπε ο 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
Δημοσ.

Δοκίμασε αυτό. Άλλαξα θέση σε κάποιες παρενθέσεις, και πρόσθεσα ένα 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;

Δημοσ.

Σας ευχαριστώ πολύ. Τελικά ο παρακάτω κώδικας φάνηκε να δουλεύει...ωστόσο για να το κάνω λίγο πιο 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`

Δημοσ.

Να ρωτήσω εγώ κάτι, ο λόγος που δεν χρησιμοποιείς μεταβλητές ή έστω CTE (δεν ξέρω αν έχει η MySQL) ποιος είναι; Για να μην καταλαβαίνει κανείς τι γράφεις;

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

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

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

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

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

Σύνδεση

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

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