2016-09-19 51 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;