Parfois ORA-00907: missing right parenthesis
signifie exactement cela :nous avons un crochet gauche sans crochet droit correspondant. Mais elle peut aussi être levée par une erreur de syntaxe dans une partie d'une instruction délimitée par des parenthèses.
C'est cette deuxième cause ici :LIMIT est une commande Mysql qu'Oracle ne reconnaît pas. Vous pouvez utiliser une fonction analytique ici :
SELECT A1.artistid, A1.firstname, TEMP1.avgProfit
FROM
(
select artistid
, avgProfit
, rank() over (order by avgProfit desc) as rnk
from (
SELECT
AVG(salesPrice - AcquisitionPrice) as avgProfit,
W1.artistid as artistid
FROM dtoohey.trans T1
INNER JOIN dtoohey.WORK W1
ON W1.workid = T1.workid
GROUP BY artistid
)
) TEMP1
INNER JOIN dtoohey.artist A1
ON A1.artisid = TEMP1.artistid
where TEMP1.rnk = 1
Cela utilise la fonction RANK () qui renverra plus d'une ligne si plusieurs artistes réalisent le même profit moyen. Vous voudrez peut-être utiliser ROW_NUMBER() à la place. Les fonctions analytiques peuvent être très puissantes. En savoir plus .
Vous pouvez appliquer ROWN_NUMBER(), RANK() et DENSE_RANK() à n'importe quel top-n problème. Vous pouvez également utiliser l'un d'eux pour résoudre votre premier problème.
C'est probablement un problème de données. Si l'un des nombres dans (salesPrice - AcquisitionPrice)
est nul, le résultat sera nul et ne sera pas inclus dans la moyenne. Si toutes les lignes d'un artiste sont nulles, AVG() sera nulle.
En l'occurrence, l'ordre de tri mettra NULL en dernier. Mais comme la clause PARTITION BY trie par AvgProfit desc
qui place les résultats NULL au rang 1. La solution est d'utiliser le NULLS LAST dans la clause de fenêtrage :
, rank() over (order by avgProfit desc nulls last) as rnk
Cela vous garantira un résultat non nul en haut (à condition qu'au moins un de vos artistes ait des valeurs dans les deux colonnes).