使用postgresql的累积总和

问题描述 投票:0回答:1

我有以下查询:

  select configurationfromintarray(1,string_to_array('4441,4945',',')::int[]) as config, 
        p.partname,rtrim(sum(distinct a.ref || ','),',') as refs,
        p.partid as partid,
        from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a 
        join .....
        group by configurationfromintarray(1,string_to_array('4441,4945',',')::int[]),
        p.partname,p.partid

这给出了以下结果:

config  partname  refs           partid
SBC1    test1   C250,C252        7102
SBC1    test2   C344,C419,C421   1034  
SBC2    test45  C111             3986

查询在函数中运行,info参数也相应更改。基本上它意味着对于配置SBC1我需要将部分test1放在refs C250,C252中。我不知道的是需要放置的数量。所以我需要添加一个显示该信息的列。

FROM集群有另一个名为quantity的列。

如果我做

select ref,partid,quantity
from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a
where partid=7102 order by ref

我去拿:

ref partid quanity
C250  7102   1
C252  7102  3

我想修改我的查询,以便还有一个包含所需总量的列。所以在上面的例子中它将是:

config  partname  refs           partid    QUANTITY
SBC1    test1   C250,C252        7102         4     // 3 from C250, 1 from C252
SBC1    test2   C344,C419,C421   1034         ?
SBC2    test45  C111             3986         ?

我尝试用:sum(a.quantity) OVER (PARTITION BY rtrim(sum(distinct a.ref || ','),',')) AS quantity但它不起作用。它说:

错误:列“a.quantity”必须出现在GROUP BY子句中或用于聚合函数

我该如何解决?这种总结应该难以实施。

编辑:如果我从中删除不同的单词

p.partname,rtrim(sum(distinct a.ref || ','),',') as refs,

我会得到:

config  partname  refs           partid    
SBC1    test1   C250,C252,C252,C252,C252,C250,C250,C250       7102 

distinct确保我只会看到每个参考一次。但是我不能使用distinct关键字来计算数量,所以如果我只是添加:sum(a.quantity)我会得到不正确的结果。

config  partname  refs                                        partid quantity
SBC1    test1   C250,C252,C252,C252,C252,C250,C250,C250       7102     16 

我需要它只能将每个参考的数量相加一次!

sql postgresql
1个回答
0
投票

我会从一个简单的sum(quantity)开始:

select configurationfromintarray(1,string_to_array('4441,4945',',')::int[]) as config, 
        p.partname, rtrim(sum(distinct a.ref || ','),',') as refs,
        p.partid as partid,
        sum(quantity)
from productiongeneratebom(string_to_array('4441,4945',',')::int[],2405) a join .....
group by config, p.partname, p.partid;

如果要组合多行的值,可以使用窗口函数。

© www.soinside.com 2019 - 2024. All rights reserved.