時々ORA-00907: missing right parenthesis
つまり、右角かっこが一致しない左角かっこがあります。ただし、括弧で囲まれたステートメントの一部の構文エラーによってスローされることもあります。
ここでの2番目の原因は次のとおりです。LIMITは、Oracleが認識しないMysqlコマンドです。ここで分析関数を使用できます:
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
これは、複数のアーティストが同じ平均利益を達成した場合に複数の行を返すRANK()関数を使用します。代わりにROW_NUMBER()を使用することをお勧めします。分析関数は非常に強力です。 詳細a> 。
ROWN_NUMBER()、RANK()、およびDENSE_RANK()を任意のトップに適用できます- n 問題。それらの1つを使用して、最初の問題を解決することもできます。
それはおそらくデータの問題です。 (salesPrice - AcquisitionPrice)
の番号の1つである場合 nullの場合、結果はnullになり、平均には含まれません。アーティストのすべての行がnullの場合、AVG()はnullになります。
たまたま、ソート順はNULLを最後に置きます。ただし、PARTITIONBY句はAvgProfit desc
で並べ替えられるため これにより、NULLの結果がランク1になります。解決策は、ウィンドウ句でNULLSLASTを使用することです。
, rank() over (order by avgProfit desc nulls last) as rnk
これにより、上部にnull以外の結果が保証されます(少なくとも1人のアーティストが両方の列に値を持っている場合)。