使用从Sub查询返回的两个值来计算Sum,Oracle

时间:2017-11-03 00:11:09

标签: sql oracle

经过几个小时的尝试后,我已经达到了这样的程度,我认为我已经在网站上提出了这个问题。原则上我觉得我试图做的事情并不过分困难,我认为我在某个地方有一个知识空白,所以可能在事情中发挥作用。

最终我试图在屏幕上显示一行信息,并使用Oracle中的SUM函数进行两个子查询,这两个都在工作。一个返回与人工相关的数字值,另一个返回与所需部件相关的数字值。接下来,我试图将这两个返回到SELECT的一个列,我调用了grand_total。但是,我一直收到ORA-00904错误,无效的标识符。我错了吗?我的别名是错误的吗?我试图做的是什么?以下是我的代码:

 cars.body,
 cars.payment,
   (
     select sum(parts) from (select distinct(item_number) from account where  
      refnumber='123456')
    ) P,
    (
      select sum(labor) from (select distinct(item_number) from account where acct_id='123456')
      )  L,
     (
       sum(L + P)
     ) as grand_total,

2 个答案:

答案 0 :(得分:0)

您的陈述尚未完成,您的数据模型对我毫无意义。但是,当前的问题是你:

  1. 尝试从子查询中选择不在该子查询中的列。 select distinct(item_number) from account where refnumber='123456'没有可选列。该查询的select子句中没有名为partslabor的列。
  2. 您正尝试在同一个select子句中引用列别名。 select子句项全部并行执行,因此无法在同一select子句中的其他位置引用别名L。你需要嵌套,我推荐一个Common Table Expression。
  3. 假设您的架构是

    create table account
    (acct_id int 
    ,item_number int
    ,refnumber int);
    
    create table cars
    (car_id int
    ,body varchar2(100)
    ,payment number
    ,parts number
    ,labor number);
    

    然后以下是有效的SQL:

    WITH subtotals AS (
     SELECT cars.body,
      cars.payment,
      sum(parts) parts_total,
      sum(labor) labor_total
     FROM cars
     INNER JOIN account ON cars.car_id = account.refnumber
     GROUP BY cars.body, 
      cars.payment
    )
    SELECT body,
      payment,
      parts_total,
      labor_total,
      parts_total + labor_total as grand_total
    FROM subtotals;
    

答案 1 :(得分:0)

这一行毫无意义,你不能在一个选择语句中有两个。

 select sum(parts) from (select distinct(item_number) from account

也许在下面试试?您可以在一个查询中对其进行求和,因为它们来自同一个表帐户

select distinct itemnumber,
      sum(parts) over(partition by itemnumber) + sum(labour) over(partition by itemnumber) as grandtotal
  from (
        -- this is dummy data just for make the select statement work
        select 'itemone' itemnumber, 16 parts, 13 labour
          from dual
        union all
        select 'itemone' itemnumber, 32 parts, 93 labour
          from dual
        union all
        select 'itemtwo' itemnumber, 12 parts, 17 labour
          from dual
        union all
        select 'itemthree' itemnumber, 24 parts, 43 labour
          from dual
        union all
        select 'itemthree' itemnumber, 25 parts, 52 labour
          from dual
        union all
        select 'itemfour' itemnumber, 112 parts, 73 labour
          from dual)