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
mais quand je le sélectionne séparément, cela fonctionne bien: P> AVG (max (E.Salary)) Code>
Dans le cas de l'expression, il renvoie pas une fonction de groupe mono-groupe code> erreur
`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;`
4 Réponses :
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;
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 i> max est dans votre La requête code> 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 () code> 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; code>
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.
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
Il renvoie "ORA-01747: utilisateur invalide.Table.Column.Column, table.Column ou spécification de colonne" Erreur
[Country_Code] CODE> est un identifiant invalide dans SQL. Vous devez supprimer ces crochets. Plus: la colonne est nommée
pays_id code> dans la question.
Vous pouvez y parvenir par une sélection externe et séparer acclamations !! / p> p> max code> et
avg code> comme suit:
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
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 p>
C'est un cas
code> expression i>.