使用LEFT JOIN执行两次数学运算的SELECT吗?

时间:2018-12-10 16:34:06

标签: sql oracle

我想要做的一般想法是: 选择订单的所有计划价格,然后从该订单的所有实际价格中减去。

计划价格和实际价格在不同的表上。当我有一个计划价格和一个实际价格时,这可以正常工作。但是,当我有多个计划价格或多个实际价格时,仿佛代数发生了多次一样,结果却很奇怪。

查询:

    SELECT PL.orderid, (SUM(PL.lineprice) - NVL(SUM(AC.lineprice),0)) AS 
    Difference FROM plans PL
    LEFT JOIN actuals AC ON PL.orderid = AC.orderid
    WHERE PL.customer IN (SELECT customer FROM ...)
    GROUP BY PL.orderid
    ORDER BY PL.orderid;

查询结果:

Orderid Difference
X-1224      100
X-1226      80
X-1345      70000
X-1351      125000
X-1352      10000
Y-2403      190000

我的计划表如下:

Orderid Planned_Price
X-1224      100
X-1226      100
X-1345      105000
X-1351      100000
X-1352      10000
X-1352      50000
Y-2403      25000
Y-2403      100000

这是我的实际表:

Orderid Actual_Price
X-1226      20
X-1345      35000
X-1351      25000
X-1351      50000
X-1352      25000
Y-2403      25000
Y-2403      5000

因此,当我每个表中只有一行,或者计划中只有一行,而实际中没有行时,即X-1224,X-1226和X-1345 ,这似乎可行

但是,当我在任一表(即其余所有表)中都有多行具有相同OrderID的行时,结果太高或太低

我很困惑为什么会这样。任何见解都会受到赞赏。

编辑:我想要的结果以Y-2403为例:(25000 + 100000)-(25000 + 5000)= 95000。我得到的是190000的两倍。

2 个答案:

答案 0 :(得分:2)

  

为什么会这样?

因为join的工作方式。如果您有这样的数据:

 a
 1
 1
 2
 2

和b:

 b
 1
 1
 1
 2

然后join的结果为6个“ 1”和2个“ 2”。

您的问题并没有说明您要获得什么结果,但是典型的方法是在进行连接之前先汇总

编辑:

您似乎想要:

select p.orderid,
       (p.lineprice - coalesce(lineprice, 0)) as Difference
from (select orderid, sum(lineprice) as lineprice
      from plans p
      group by orderid
     ) p left join
    (select orderid, sum(lineprice) as lineprice
     from actuals a
     group by orderid
    ) a
    on p.orderid = a.orderid
where p.customer in (SELECT customer FROM ...)
order by p.orderid;

答案 1 :(得分:1)

我想您要比较计划表的订单ID的summed_up_prices与实际计划表的order ID的summed_up价格。?

如果是这样,可以执行以下操作以确保没有重复的订单项

select a.orderid
       ,NVL(max(b.summed_up),0) - sum(a.actual_price) as difference          
     from actual_table a
left join (select pt.orderid
                 ,sum(pt.planned_price) as summed_up
            from planned_table pt
           group by pt.orderid
           )b
        on a.orderid=b.orderid
  group by a.orderid

+---------+------------+
| ORDERID | DIFFERENCE |
+---------+------------+
| X-1226  |         80 |
| Y-2403  |      95000 |
| X-1351  |      25000 |
| X-1345  |      70000 |
| X-1352  |      35000 |
+---------+------------+

这是带有数据的dbfiddle链接

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=3cacffd19b39ecaf7ad752dff262ac47