根据条件获取列的总和
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(这有助于理解逻辑)。
我正在处理 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(这有助于理解逻辑)。