我在PostgreSQL
中有以下表格A:
idMain idSub quantity
49; 83604; 3000.0000
49; 84361; 16000.0000
49; 84268; 30
47; 84268; 10.0000
我有一个查询选择idMain
并显示有关它的数据。我需要为此查询添加另一列,以便SUM
quantity
idMain
{排除我自己的quantity
)idSub
相同。
所需的数据是:
idMain idSub quantity newcolumn
49; 83604; 3000.0000 0 //no other 83604 so 0
49; 84361; 16000.0000 0 //no other 84361 so 0
49; 84268; 30 10.0000 //other 84268 is 10.000 (and don't count my own 30)
首先我做了:
select idMain,IdSub,coalesce( SUM(quantity) OVER (PARTITION BY idSub) - quantity ,0)
from A
where idMain=49
请注意,WHERE
上的查询会移除idMain=47
,因此我所做的并不起作用,因为它没有与idMain=47
然后我尝试了:
select idMain,IdSub,(SELECT coalesce( SUM(quantity) OVER (PARTITION BY a2.idSub) - a2.quantity,0) from A a2 where a2.idSub=a.idSub)
from A
where idMain=49
但这也不起作用。
任何人都知道如何获得它?我觉得我非常接近。
答案 0 :(得分:1)
你的第一个版本几乎是正确的。您只需要使用子查询(或CTE):
select t.*
from (select idMain, IdSub,
coalesce(SUM(quantity) OVER (PARTITION BY idSub) - quantity, 0
) as newcol
from A
) t
where idMain = 49;
在您的版本中,它会在计算sum()
之前进行过滤。这不是你想要的,所以是救援的子查询。
答案 1 :(得分:1)
Gordon的回答会返回正确的结果,但在idMain上应用过滤器之前,这将首先计算所有行的Group Sum。
您的第二个查询也几乎正确(并且应首先应用过滤器),您只需要删除OVER并使用简单的标量子查询:
select idMain,IdSub,quantity,
coalesce((SELECT SUM(quantity)
from A a2
where a2.idSub=a.idSub) - quantity,0) as new column
from A
where idMain=49;