我有这个数据库图表:
该图表代表保险公司的数据库。
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
!
答案 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;