从子查询返回的多个记录中检索记录

时间:2014-12-30 19:29:43

标签: sql oracle oracle11g group-by sql-order-by

我有这个数据库图表:

enter image description here

该图表代表保险公司的数据库。

final_cost表表示公司应该为维修汽车而支付的费用

car的字段car_type取以下值之一(1,2,3),其中1表示小型车,2表示卡车,3表示公共汽车

我想检索在2013年期间具有最大修复成本的种类(1或2或3)的名称

我写了以下查询:

select innerr.car_type from (
  select car_type ,sum(fina_cost.cost) from car_acc inner join cars on cars.car_id = car_acc.car_id
  inner join final_cost on FINAL_COST.CAR_ACC_ID = car_acc.CAR_ACC_ID
  where (extract(year from final_cost.fittest_date)=2013)
  group by(car_type)) innerr;

但我不知道如何从car_type子查询中获得具有最大修复成本的inner

3 个答案:

答案 0 :(得分:1)

如果您正确使用子查询,则可以访问子查询中的任何内容和所有内容。构建复杂查询的最佳方法是简单地开始,查看您拥有的数据,通常是答案,或者下一步,将是显而易见的。

让我们首先展示2013年的所有事故。我们对个别汽车不感兴趣,只是按类型划分的最昂贵的事故。所以......

select  c.car_type, f.cost
from    car_acc a
join    cars    c
    on  c.car_id = a.car_id
join    final_cost f
    on  f.car_acc_id = a.car_acc_id
where   f.fittest_date >= date '2013-01-01'
   and  f.fittest_date <  date '2014-01-01';

为了提高效率,我已将过滤条件更改为可搜索的形式。我通常不会在设计查询的早期担心性能,但是当它显而易见时,为什么不呢?

无论如何,我们现在列出了所有2013年的事故,按车型和每个事故的成本。所以现在我们只需要group by类型并获取每个组的Max费用。

select  c.car_type, Max( f.cost ) MaxCost
from    car_acc a
join    cars    c
    on  c.car_id = a.car_id
join    final_cost f
    on  f.car_acc_id = a.car_acc_id
where   f.fittest_date >= date '2013-01-01'
   and  f.fittest_date <  date '2014-01-01'
group by c.car_type;

现在我们列出了2013年该类型的汽车类型和最昂贵的事故。结果集中只有三行,很容易看出我们正在寻找的汽车类型。现在我们只需隔离那一行。从这里开始最简单的步骤是在CTE中使用此查询。

with MaxPerType( car_type, MaxCost )as(
  select  c.car_type, Max( f.cost ) MaxCost
  from    car_acc a
  join    cars    c
      on  c.car_id = a.car_id
  join    final_cost f
      on  f.car_acc_id = a.car_acc_id
  where   f.fittest_date >= date '2013-01-01'
     and  f.fittest_date <  date '2014-01-01'
  group by c.car_type
)
select  m.car_type, m.MaxCost
from    MaxPerType m
where   m.MaxCost =(
     select  Max( MaxCost )
     from    MaxPerType );

因此,CTE为每个类型提供了最大的成本,主查询中的子查询为我们提供了最大的总成本。因此,结果是匹配总体最大成本的类型。

答案 1 :(得分:0)

您可以尝试使用orderby或更高版本,使用最大函数http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions085.htm

答案 2 :(得分:0)

试试这个:

SELECT A.car_type 
FROM (SELECT c.car_type, SUM(fc.cost) totalCost
      FROM car_accident ca
      INNER JOIN cars c ON c.car_id = ca.car_id
      INNER JOIN final_cost fc ON fc.CAR_ACC_ID = ca.CAR_ACC_ID
      WHERE EXTRACT(YEAR FROM fc.fittest_date) = 2013
      GROUP BY c.car_type
      ORDER BY totalCost DESC
     ) AS A
WHERE ROWNUM = 1;