2

我有 4 个具有以下结构的表:

artist

artistID lastname firstname nationality dateofbirth datedcease

work

workId title copy medium description artist ID

Trans

TransactionID Date Acquired Acquistionprice datesold askingprice salesprice customerID workID

Customer

customerID lastname Firstname street city state zippostalcode country areacode phonenumber email

第一个问题是哪位艺术家的作品最多,artsold以及有多少艺术家的作品被售出。

我的 SQL 查询是这样的:

SELECT * From dtoohey.artist A1 
INNER JOIN 
(
    SELECT COUNT(W1.ArtistID) AS COUNTER, artistID  FROM dtoohey.trans T1
    INNER JOIN dtoohey.work W1
    ON W1.workid = T1.Workid
    GROUP BY W1.artistID
) TEMP1
ON TEMP1.artistID = A1.artistID
WHERE A1.artistID = TEMP1.artistId
ORDER BY COUNTER desc;

我要得到整张桌子,但我只想显示最高计数的第一行我该怎么做?

我已尝试插入WHERE ROWNUM <=1 ,但它显示艺术家 ID 为 1

qns 2 是哪位艺术家的作品获得最高平均利润的销售额(即艺术家每次销售作品所获得的平均利润),该金额是多少。

我的 SQL 查询是:

SELECT A1.artistid, A1.firstname FROM
(
    SELECT 
        (salesPrice - AcquisitionPrice) as profit, 
        w1.artistid as ArtistID 
    FROM dtoohey.trans T1
    INNER JOIN dtoohey.WORK W1
    on W1.workid = T1.workid
) TEMP1
INNER JOIN dtoohey.artist A1
ON A1.artistID = TEMP1.artistID
GROUP BY A1.artistid
HAVING MAX(PROFIT) = AVG(PROFIT);

我无法执行它

我已经尝试了下面的查询,但仍然无法得到它不断收到错误丢失右括号

SELECT A1.artistid, A1.firstname, TEMP1.avgProfit
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
    ORDER BY avgProfit DESC
    LIMIT 1
) TEMP1
INNER JOIN dtoohey.artist A1
ON A1.artisid = TEMP1.artistid
4

2 回答 2

2

有时ORA-00907: missing right parenthesis就是这个意思:我们有一个左括号而没有匹配的右括号。但它也可能由括号限定的语句部分中的语法错误引发。

这是第二个原因: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() 。分析功能可能非常强大。 了解更多

您可以将 ROWN_NUMBER()、RANK() 和 DENSE_RANK() 应用于任何前n 个问题。您也可以使用其中一个来解决您的第一个问题。


“但是平均利润为零。”

这应该是数据问题。如果其中一个数字(salesPrice - AcquisitionPrice)为空,则结果将为空,并且不会包含在平均值中。如果艺术家的所有行都为空,则 AVG() 将为空。

碰巧排序顺序将NULL放在最后。但是,由于 PARTITION BY 子句的排序方式AvgProfit desc将 NULL 结果排在第 1 位。解决方案是在窗口子句中使用 NULLS LAST:

            , rank() over (order by avgProfit desc nulls last) as rnk

这将保证您在顶部获得非空结果(前提是您的艺术家中至少有一位在两列中都有值)。

于 2012-10-07T11:18:00.037 回答
0

第一个问题 - Oracle 不保证检索行的顺序。因此,您必须先订购,然后再限制有序集。SELECT * from ( SELECT A1.* From dtoohey.artist A1 INNER JOIN ( SELECT COUNT(W1.ArtistID) AS COUNTER, artistID FROM dtoohey.trans T1 INNER JOIN dtoohey.work W1 ON W1.workid = T1.Workid GROUP BY W1。 artistID ) TEMP1 ON TEMP1.artistID = A1.artistID WHERE A1.artistID = TEMP1.artistId ORDER BY COUNTER desc ) WHERE ROWNUM = 1

第二个问题:我相信(尚未测试)您的 LIMIT 1 错误。该关键字用于批量收集。

于 2012-10-07T11:21:21.893 回答