在查询中使用SUM函数消除行

时间:2015-08-12 11:59:55

标签: sql postgresql

我在PostgreSQL中有以下表格A:

idMain  idSub    quantity
49;     83604;   3000.0000
49;     84361;   16000.0000
49;     84268;   30
47;     84268;   10.0000

我有一个查询选择idMain并显示有关它的数据。我需要为此查询添加另一列,以便SUM quantity idMain {排除我自己的quantityidSub相同。

所需的数据是:

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

但这也不起作用。

任何人都知道如何获得它?我觉得我非常接近。

2 个答案:

答案 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;