根据条件获取列的总和

时间:2019-03-28 00:04:13

标签: sql postgresql join sum

我正在处理SQL查询。查询如下:

Select 
    a.field1,
    b.field2,
    c.field3,
    c.field4,
    b.filed5,
    a.field6,
    d.field7 
from 
    a 
    Inner join b on a.field1 = b.field1 
    right join c on b.field2 = c.field3 
    left  join d on d.filed3 = a.field1 
where some conditions;

上面的输出将是这样的:

field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name   | value1 | other1 | 1      | diff   |   new  | 100
name1  | value2 | other2 | 1      | diff1  |   new1 | 100
name2  | value3 | other3 | 2      | diff2  |   new2 | 100

因此,我需要在结果中添加一个新列,以根据field7的值对field4求和(如果它们相同)。

在SQL中可能吗?我在这里尝试使用Group by field 4,但收到一个错误,指出应该在分组依据中使用field1。因此我无法获得预期的结果。

预期结果:

field1 | field2 | field3 | field4 | field5 | field6 | field7
--------------------------------------------------------------
name   | value1 | other1 | 1      | diff   |   new  | 200
some   | value3 | other3 | 2      | diff2  |   new2 | 100

基本上我想根据条件删除一列并求和最后一个字段。

任何建议都是有帮助的。

2 个答案:

答案 0 :(得分:2)

您可以在查询中使用分区,根据field4创建一个单独的分区,然后求和

SELECT
z.* FROM (SELECT
a.field1,
b.field2,
c.field3,
b.filed5,
a.field6,
SUM(d.field4) OVER (PARTITION BY a.field1, b.field2, c.field3, b.filed5, a.field6) AS field7,
ROW_NUMBER() OVER (PARTITION BY c.field4 ORDER BY c.field4) AS rank FROM a INNER JOIN b
ON a.field1 = b.field1 RIGHT JOIN c
ON b.field2 = c.field3 LEFT JOIN d
ON d.filed3 = a.field1 where some conditions; ) z WHERE z.rank = 1

答案 1 :(得分:2)

要计算具有相同premium的记录组中field7的总和,可以使用窗口函数field4

要只为每组具有相同SUM(...) OVER(...)的记录保留一条记录,可以在内部查询中使用field4并在外部查询中过滤掉不需要的记录。请注意,您需要排序条件才能可靠地选择应在每个组中保留的记录。我选择使用ROW_NUMBER()(根据需要更改):

您的(伪)查询应类似于:

field1

提示:您可以独立运行内部查询以查看其返回的内容(这有助于理解逻辑)。