-1
votes

J'essaie d'obtenir une fonction Max fonctionner, mais elle renvoie NULL suivi des nombres décimaux

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 commentaires

Vous n'avez pas de jointure entre Employés et - quelque chose qui n'aurait pas été arrivé si vous aviez utilisé un opérateur explicite


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 ??


3 Réponses :


0
votes

Il y a plusieurs problèmes:

  • Vous avez un produit cartésien entre les tables. Utilisez la syntaxe de jointure moderne pour éviter que cela se produise par accident. LI>
  • Il n'y a pas de lien direct entre les employés et les emplacements; Vous devez passer par les départements. Li>
  • Vous commandez par des valeurs ascendantes, de sorte que les valeurs plus basses arrivent en premier. li>
  • Vous devriez commander avant em> appliquer un 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;
    


4 commentaires

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é)



0
votes

Essayez ceci: xxx


0 commentaires

0
votes

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


0 commentaires