2016-09-19 50 views
0

我有查詢,其中我通過從租賃金額中減去分配成本來計算利潤。然後將這個結果除以分銷成本。通過乘以100將此值轉換爲百分比,然後將標題命名爲「Profit%」。我如何在Where條款中使用不明字符

我該如何製作一份報告,報告所有產生低於100%利潤的電影。包括電影名稱,返回的百分比利潤(四捨五入到小數點後一位;標題利潤百分比)以及它被租用的次數(標題已出租)。 我的工作是

SELECT Name,TO_CHAR(((Movie.RentalAmount - 
    DistributionCost)/DistributionCost)*100.00,'999.999') AS "Profit %", 
    COUNT(MovieRented.MOVIEID) 
FROM Movie , MovieRented 
WHERE Movie.MovieID = MovieRented.MovieID 
AND 'Profit %' <= '100.00'; 
+0

'和NUMBER(「Profit%」)<= 100.00' - 雙引號爲_name_和數字的數字,而不是字符串:'9'>'10'。不確定NUMBER –

+1

''Profit%''是字符常量(常量),列需要用雙引號括起來,就像您在定義別名時所做的那樣。而'100.00'也是一個字符值,不是數字 - 不會將數字與字符串進行比較 –

回答

1

你只需要重新計算where子句中的利潤。

SELECT Name,TO_CHAR(((Movie.RentalAmount - 
    DistributionCost)/DistributionCost)*100.00,'999.999') AS "Profit %", 
    COUNT(MovieRented.MOVIEID) 
FROM Movie , MovieRented 
WHERE Movie.MovieID = MovieRented.MovieID 
AND (Movie.RentalAmount - DistributionCost)/DistributionCost <= 100; 
0

我相信,因爲您在選擇查詢中使用聚合函數,所以您需要在查詢中使用GROUP BY關鍵字。 您可以將它用作內嵌視圖,並且可以在結果中使用過濾條件如下。

SELECT * 
FROM (
     SELECT Name, 
       TO_CHAR(((Movie.RentalAmount - 
       DistributionCost)/DistributionCost)*100.00,'999.999') AS "Profit %", 
       COUNT(MovieRented.MOVIEID) 
     FROM Movie , 
       MovieRented 
     WHERE Movie.MovieID = MovieRented.MovieID 
     GROUP BY Name, 
       Movie.RentalAmount, 
       DistributionCost) 
WHERE TO_NUMBER("Profit %") <= 100; 
    ` 
+0

@ThorstenKettner:啊,我沒有意識到'to_char()'被應用於計算(因爲表達式跨越多行) –

1

首先:當你想要每個電影一個結果行,然後按電影分組。

然後看看'Profit %' <= '100.00'。你在這裏比較兩個字符串。它應該是別名「利潤百分比」而不是雙引號,並且仍然會比較字符串,其中'20' > '100.00',因爲'2' > '1'

然後,如果你想找到小於100的利潤,你應該使用<而不是< =當然。

順便說一句:請使用適當的連接。逗號分隔的連接由於某種原因被顯式連接取代。

select name, to_char(profitrate, '990D0') as "Profit %", rented 
from 
(
    select 
    m.name, 
    ((sum(m.rentalamount) - sum(mr.distributioncost))/sum(mr.distributioncost)) * 100.0 
     as profitrate, 
    count(*) as rented 
    from movie m 
    join movierented mr on mr.movieid = m.movieid 
    group by m.movieid, m.name 
) 
where profitrate < 100;