首页 > 解决方案 > 从最终结果中过滤掉行,同时仍然使用它们的一些值?

问题描述

举个例子,假设我有一个返回以下结果的视图:

| id | foreignkey | value1 | value2 |
|----|------------|--------|--------|
| 1  | 500        | -100   | 0      |
| 2  | 500        | 900    | 15     |
| 3  | 500        | 570    | 25     |
| 4  | 999        | 100    | 57     |
| 5  | 999        | 150    | 0      |

我试图实现的逻辑如下 -

所以在这个例子中,我希望最终结果是

| id | foreignkey | value1 | value2 |
|----|------------|--------|--------|
| 2  | 500        | 800    | 15     |
| 3  | 500        | 470    | 25     |
| 4  | 999        | 250    | 57     |

有任何想法吗?我在想一些group by可能的事情,但还没有提出解决方案。

标签: sqlsql-serverlogic

解决方案


SUM()窗口功能:

select id, foreignkey, value1 + coalesce(total, 0) value1, value2
from (
  select *, 
    sum(case when value2 = 0 then value1 end) over (partition by foreignkey) total
  from tablename
) t 
where value2 <> 0

演示
结果:

> id | foreignkey | value1 | value2
> -: | ---------: | -----: | -----:
>  2 |        500 |    800 |     15
>  3 |        500 |    470 |     25
>  4 |        999 |    250 |     57

推荐阅读