我想要做的一般想法是: 选择订单的所有计划价格,然后从该订单的所有实际价格中减去。
计划价格和实际价格在不同的表上。当我有一个计划价格和一个实际价格时,这可以正常工作。但是,当我有多个计划价格或多个实际价格时,仿佛代数发生了多次一样,结果却很奇怪。
查询:
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的两倍。
答案 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