SQL - сумма значений, когда есть ноль - PullRequest
0 голосов
/ 03 июня 2019

У меня есть следующая таблица:

RowID Column1 Column2
1       3       2
2       5       2
3       2       9
4       5      NULL
5       8      NULL
6       9       3
7       1      NULL

Мне нужна первая строка Column1 для суммирования каждый раз, когда в Column2 есть значение NULL. И это продолжит логику по строкам. Итак, результат должен выглядеть так:

RowID Column1 Column2
1       3       2
2       5       2
3       15      9
4       5      NULL
5       8      NULL
6       10      3
7       1      NULL

Уведомление Строка 3 суммируется 2 + 5 + 8 = 15, а Строка 6 суммируется 9 + 1 = 10. Таким образом, в основном строка до значения Null в Column2 суммировала значения в column1 до тех пор, пока в column2 не осталось больше значений NULL. Затем он возобновился в строке 6, где следующее значение было NULL.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Я понял. Вы должны смотреть на строки в обратном порядке, присваивая значения NULL значению перед ними.

Идея состоит в том, чтобы назначить группу строкам для суммирования. Это число не NULL значений, следующих за строкой. При этом вы можете использовать оконную функцию для агрегирования:

select t.*,
       (case when c2 is null then c1
             else sum(c1) over (partition by grp)
        end) as new_c1
from (select t.*, count(c2) over (order by rowid rows between 1 following and unbounded following) as grp
      from t
     ) t
order by rowid;

Здесь - это дБ <> скрипка.

0 голосов
/ 03 июня 2019

Это сделает это.Я настроил данные в табличной переменной для демонстрации.

declare @t table(RowID int, C1 int, C2 int)
insert @t values (1, 3, 2)
,(2, 5, 2)
,(3, 2, 9)
,(4, 5, NULL)
,(5, 8, NULL)
,(6, 9, 3)
,(7, 1, NULL)

select RowID, sum(C1), max(C2)
from (
select RowID, C1, C2 from @t  
union all
select T1.RowID, T2.C1, null
from @t t1
join @t t2 on t2.RowID>t1.RowID and t2.C2 is null
    and not exists(
        select * from @t t3 
        where t3.RowID>t1.RowID and t3.c2 is not null and t3.RowID<t2.RowID
        )
where T1.C2 is not null
) q group by RowID

Результат:

RowID   C1  C2
1       3   2
2       5   2
3       15  9
4       5   NULL
5       8   NULL
6       10  3
7       1   NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...