如何显示在甲骨文最高值的记录?(How to display the record with the

2019-08-01 05:18发布

我有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是销售其艺术家的作品已经产生最高的平均利润(IE)的平均对worksby一个艺术家的每个销售的利润的),什么是量。

我的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

Answer 1:

有时, ORA-00907: missing right parenthesis意味着实际上是:我们有没有匹配的右一个左括号。 但它也可以由一个语法错误由括号包围的语句的一部分的抛出。

这是第二个原因在这里:限制是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(),以任何顶级ñ问题。 您可以使用其中一个来过解决您的第一个问题。


“然而,平均利润是零。”

这可能是一个数据问题。 如果在号码之一(salesPrice - AcquisitionPrice)是空的结果将是空的,将不包括在平均。 如果所有的艺术家行是空的AVG()将是无效的。

因为它发生的排序顺序将会把NULL最后。 但随着PARTITION BY子句排序由AvgProfit desc ,它将在NULL结果在排名1。解决的办法是开窗子句中最后使用的NULL:

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

这将保证你在顶部有一个非空的结果(提供在两列的艺术家中的至少一个具有值)。



Answer 2:

第一个问题 - Oracle不保证通过检索行的顺序。 因此,你必须先顺序,然后限制有序集合。 SELECT * FROM(SELECT A1。*从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 BY COUNTER倒序)WHERE ROWNUM = 1

第二个问题:我相信(没有测试),您有LIMIT 1个错了。 关键字是用于批量采集使用。



文章来源: How to display the record with the highest value in Oracle?