J'essaie d'obtenir cinq employés qui ont la plus haute commission_pct dans leur ville. Cependant, il retourne toujours NULL comme la valeur la plus élevée.
Steven King Bombay null Steven King Geneva null Steven King Beijing null Steven King Bern null Steven King Hiroshima null
3 Réponses :
Il y a plusieurs problèmes:
rownum code> limite. Pour le moment, vous choisissez cinq personnes indéterminées (pas assez aléatoires, mais assez étroite) résulte de votre produit cartésien, tout ce qui n'a aucune commission et montrent donc comme null; Et puis vous commandez ces cinq. Vous ne choisissez pas les cinq les plus élevés. Li>
- Vous n'avez pas besoin de regrouper car il n'y a pas de doublons. Li>
ul>
afin que vous puissiez utiliser: p> xxx pré> oracle 12c + a Fetch code> syntaxe pour éviter le rownum explicite code > Filtre: P> SELECT *
FROM (
SELECT e.first_name, e.last_name, l.city, e.commission_pct,
RANK() OVER (PARTITION BY l.city ORDER BY e.commission_pct DESC) AS rnk
FROM employees e
JOIN departments d ON d.department_id = e.department_id
JOIN locations l ON l.location_id = d.location_id
WHERE e.commission_pct IS NOT NULL
)
WHERE rnk <= 5
ORDER BY city, rnk;
Le OP a décrit le problème des mots. Dégainte au sommet, il parle du pourcentage de commissions le plus élevé de la ville. Ainsi, l'agrégation est en fait nécessaire, tout simplement pas la façon dont la puissance l'a fait.
Voir, cependant, mon deuxième commentaire sous la question de l'OP. Il dit "dans leur ville" - mais la seule ville avec des employés avec un pourcentage de commission non nulle est Oxford. Donc, tout cela est absurde.
Oui, j'ai mentionné cela et qu'il n'y a qu'une seule ville, de sorte que la distinction est inutile. Mais la version de rang traitera de toute façon?
Je faisais référence au dernier point au sommet de votre réponse: "Vous n'avez pas besoin d'agréger car il n'y a pas de doublons". Il y a des doublons dans la colonne de la ville (après les jointures), et si l'OP doit choisir cinq employés qui sont chacun «Top Commission PCT» «dans leur ville», la agrégation est nécessaire. Ou quelque chose de similaire à celui-ci, comme une fonction analytique (telle que le rang () comme vous l'avez montré)
Si vous souhaitez trouver la commission la plus élevée, commander doit être dans Desc code> commander. De plus, vous avez besoin d'une condition de jointure entre deux tables. select * from
(
SELECT first_name, last_name , city, max(commission_pct)
FROM employees join locations
on (enter join condition here)
group by first_name, last_name, city
order by Max(commission_pct) desc nulls last
)
where ROWNUM <= 5
Vous n'avez pas de jointure entre
Employés code> etcode> - quelque chose qui n'aurait pas été arrivé si vous aviez utilisé un opérateur code> explicite code>Quelle est la condition de jointure entre deux tables?
La plus grande erreur est votre groupe par clause. Pourquoi y compris l'employé d'abord et le nom de famille en groupe par? Cela entraînera des employés différents (ou plutôt des employés avec des noms différents) de toujours tomber dans différents groupes distincts. Sûrement ce n'est pas ce que tu veux ??