0
votes

AVG (max ()) ne fonctionne pas dans la déclaration de cas, Oracle SQL

Bonjour, je pratique dans le schéma HR d'Oracle. Je tiens à compter sur l'avariement des salaires maximum groupés par des pays et des emplois. Quand j'utilise AVG (max (E.Salary)) Code>
Dans le cas de l'expression, il renvoie pas une fonction de groupe mono-groupe code> erreur xxx pré>

mais quand je le sélectionne séparément, cela fonctionne bien: P>

`select  avg(max(e.salary)) as "AVARAGE"
 from hr.employees e right join hr.departments d on 
 e.department_id=d.department_id
           right join hr.locations l on d.location_id=l.location_id
           right join hr.countries c on l.country_id=c.country_id
 group by c.country_id,e.job_id;`


1 commentaires

C'est un cas expression .


4 Réponses :


2
votes

Une solution rapide ici peut-être essayer d'utiliser avg () code> comme une fonction analytique, sur l'ensemble de la table agrégée:

select
    c.country_id AS "COUNTRY CODE",
    e.job_id AS "JOB",
    case 
        when max(e.salary) > avg(max(e.salary)) over ()
        then 'HIGH SALARY'
        else 'LOW SALARY'
    end as info
from hr.employees e
right join hr.departments d
    on e.department_id = d.department_id
right join hr.locations l
    on d.location_id = l.location_id
right join hr.countries c
    on l.country_id = c.country_id
group by
    c.country_id,
    e.job_id;


5 commentaires

Merci, ça marche, mais est-il possible d'atteindre ces résultats sans fonction analytique? Les solutions ci-dessus m'ont donné des résultats erronés


La chose est, sachant ce que la valeur moyenne max est dans votre La requête nécessite, par définition, itérant que tout le résultat défini une fois pour trouver la moyenne. Donc, si vous n'utilisez pas avg () sur () vous devez subquérir et trouver la moyenne de cette façon.


Sélectionnez T.country_id comme pays_code, t.job_id en tant que travail, cas lorsque T.MAX_SALARY> AVG (T.MAX_SALARY) puis «SALAIRE HAUT SALAY 'FIN DE« SALAIRE DE SALAIRE »AS INFO DE (Sélectionnez C.Country_ID, e. job_id, max (E.Salary) en tant que max_salary à partir de hr.employs E Joindre Hr.Departments D sur E.Department_ID = d.Department_ID Rejoindre hr.Locations L sur d.location_id = l.location_id Droite Joindre Hr.Countries C sur l.country_id = c.country_id group par c.country_id, e.job_id) t Groupe par T.country_id, t.job_id, t.max_salary;


Cela renvoie "faible salaire" sur chaque rangée qui n'est pas correcte mais je ne pouvais pas obtenir ce qui ne va pas avec ça


Je recommande ma réponse actuelle, car l'alternative serait sensiblement plus de code.



0
votes

Essayez ceci:

select t1.[COUNTRY_CODE], t1.JOB, case 
      when t1.salary > avg(t1.salary) then 'HIGH SALARY'
      else 'LOW SALARY'
   end as info 
from (select c.country_id AS "COUNTRY CODE",
       e.job_id AS "JOB",
       max(e.salary) as salary
       from
       hr.employees e right join hr.departments d on 
        e.department_id=d.department_id
               right join hr.locations l on d.location_id=l.location_id
               right join hr.countries c on l.country_id=c.country_id
        group by c.country_id,e.job_id) as t1;
group by t1.[COUNTRY_CODE], t1.JOB, t1.salary


2 commentaires

Il renvoie "ORA-01747: utilisateur invalide.Table.Column.Column, table.Column ou spécification de colonne" Erreur


[Country_Code] est un identifiant invalide dans SQL. Vous devez supprimer ces crochets. Plus: la colonne est nommée pays_id dans la question.



0
votes

Vous pouvez y parvenir par une sélection externe et séparer max et avg comme suit: xxx

acclamations !! / p>


2 commentaires

Je pense que cela ne renvoie pas la réponse correcte, j'ai une réponse correcte avec la solution de Tim Biegeleisen, mais je veux y parvenir sans fonction analytique


Il renvoie «faible salaire» pour chaque rangée



0
votes

Fonction aggravée imbriquée non autorisée. Vous devriez d'abord obtenir des salaires maximum. Ensuite, sélectionnez sur le résultat avec la fonction AVG. Merci


0 commentaires