包括SUM和COUNT而不访问表两次

时间:2016-08-04 12:57:58

标签: sql oracle

我从a中提取bctable_1。让我们说,a代表汽车模型。 现在我想从table_2添加人们支付这辆车的总金额以及拥有这辆车的人数。

这样做比我更优雅吗?我不喜欢我的事实 访问table_2两次,并认为必须有一个更简单的方法。

我想补充一点,我在Oracle 11g数据库上工作,我与之合作的用户不允许创建视图,程序等。

select my_selection.*, 
      ( select sum(amount) 
          from table_2 t2 
         where t2.a = t1.a  ) as sum_buying_price, 
      ( select count(*) 
         from table_2 t2 
        where t2.a = t1.a ) as count_car_owners
from ( select a,
              b,
              c
         from table_1 t1
         ) my_selection

谢谢!

4 个答案:

答案 0 :(得分:4)

我假设a,b,c在table_1中是唯一的

select t1.a, t1.b, t1.c, sum(amount), count(*) 
  from table_1 t1
  left join table_2 t2 
        on t2.a = t1.a  
group by t1.a, t1.b, t1.c

答案 1 :(得分:3)

如果a b c是唯一的,您可以使用此

select t1.a, t1.b, t1.c, sum(amount), count(*) from table_1 t1 left join table_2 t2 on t2.a = t1.a group by t1.a, t1.b, t1.c

注意left join,好像没有记录,内连接不会返回此行。

编辑:很抱歉得到了另一个答案(但没有对Paparazzi的回答发表评论),还没有足够的回复发表评论。

P.S。count(*)返回0时,sum(amount)会返回null。可以用nvl修复:

nvl(sum(amount), 0)

答案 2 :(得分:1)

我认为你正在寻找这样的东西:

select t1.a, 
       t1.b, 
       t1.c, 
       sum_buying_price,
       count_car_owners
from table_1 t1
inner join
    ( select a, 
             sum(amount) as sum_buying_price, 
             count(*) as count_car_owners
      from table_2 
      group by a
    ) t2  on t1.a = t2.a

我没有要测试的oracle数据库,你没有提供相关的表格结构或样本数据,所以我无法真正测试它。

答案 3 :(得分:-1)

试试这个,

select my_selection.*, 
      ( select sum(amount) 
          from table_2 t2 
         where t2.a = my_selection.a  ) as sum_buying_price, 
      ( select count(*) 
         from table_2 t2 
        where t2.a = my_selection.a ) as count_car_owners
from ( select a,
              b,
              c
         from table_1
         ) my_selection