根据条件获取列的总和

Get Sum for the column based on a condition

我正在处理 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

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

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

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

任何建议都有帮助。

可以使用partition by query根据field4单独创建partition,然后求和

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

要计算具有相同 field4 的记录组中 field7 的总和,您可以使用 window 函数 SUM(...) OVER(...).

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

您的(伪)查询应如下所示:

SELECT * FROM (
    SELECT 
        a.field1,
        b.field2,
        c.field3,
        c.field4,
        b.filed5,
        a.field6,
        SUM(d.field7) OVER(PARTITION BY c.field4) sm,
        ROW_NUMBER()  OVER(PARTITION BY c.field4 ORDER BY a.field1) rn,
    FROM
        a 
        INNER JOIN b on a.field1 = b.field1 
        RIGHT JOIN c on b.field2 = c.field3 
        LEFT  JOIN d on d.field3 = a.field1 
    WHERE some conditions
) x
WHERE rn = 1

提示:你可以运行独立的内部查询来查看它returns(这有助于理解逻辑)。